You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用字典推导式替代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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 03:06:29