如何用字典推导式替代collections.defaultdict实现字典列表转换?
用字典推导式替代defaultdict分组是否可行?
可行,但字典推导式没法像defaultdict(list)那样自动为不存在的键初始化列表,所以需要换思路实现分组,下面给两种常见方案:
方案1:基于唯一键的推导式(简单但效率稍低)
先提取所有唯一的size值,再逐个收集对应path:
file_list = [ {"path": "/a.txt", "size": 100}, {"path": "/b.txt", "size": 200}, {"path": "/c.txt", "size": 100}, {"path": "/d.txt", "size": 300} ] size_groups = { size: [item["path"] for item in file_list if item["size"] == size] for size in {item["size"] for item in file_list} }
缺点:会多次遍历file_list(每个唯一size遍历一次),数据量大时效率不如defaultdict的单次循环。
方案2:结合itertools.groupby(效率更高但需排序)
利用groupby先按size分组,再通过推导式生成字典:
from itertools import groupby file_list = [ {"path": "/a.txt", "size": 100}, {"path": "/b.txt", "size": 200}, {"path": "/c.txt", "size": 100}, {"path": "/d.txt", "size": 300} ] # groupby要求先按分组键排序 sorted_files = sorted(file_list, key=lambda x: x["size"]) size_groups = { size: [item["path"] for item in group] for size, group in groupby(sorted_files, key=lambda x: x["size"]) }
注意:groupby只会对连续相同的键分组,所以必须先排序;但这种方式只需要遍历两次列表(排序+分组),效率比方案1高。
对比总结
- 如果追求代码极简且数据量小,方案1足够用;
- 如果数据量大,或本来就需要对列表按
size排序,方案2更合适; - 若不需要排序且追求最高效率,原
defaultdict的循环写法其实是最优选择,没必要强行用字典推导式。
内容的提问来源于stack exchange,提问作者quantum231
相关产品推荐
相关产品推荐

