如何高效聚合两个字典?按键求和合并的最优方法
我有两个字典:
a = {'a':1, 'b':2, 'c':3, 'd':4} b = {'a':10, 'b':20, 'c':30, 'e':50}
我希望合并这两个字典,对共同键对应的值进行求和聚合,最终得到如下结果:
merged = {'a':11, 'b':22, 'c':33, 'd':4, 'e':50}
目前我知道一种可行方案是将两个dict转换为pandas DataFrame,使用groupby()处理后再转回dict,但我想了解是否存在更高效的实现方式?
高效实现方案
当然有!相比依赖pandas的方案,纯Python的实现通常更轻量、开销更低,这里给你几种实用的高效方法:
方法1:普通字典循环(直观且性能优异)
这是最基础也最高效的方式之一,不需要任何额外库,逻辑清晰易懂:
merged = a.copy() # 先复制第一个字典的所有键值对 for key, value in b.items(): if key in merged: merged[key] += value else: merged[key] = value
优点:没有第三方依赖,内存占用小,对于中小型字典来说速度最快,调试和维护也简单。
方法2:用collections.defaultdict简化累加逻辑
借助标准库的defaultdict,可以省去判断键是否存在的步骤,代码更简洁:
from collections import defaultdict merged = defaultdict(int) # 遍历所有需要合并的字典 for d in (a, b): for key, value in d.items(): merged[key] += value # 如需转回普通字典,执行下面这行 merged = dict(merged)
优点:扩展性极强,如果后续需要合并3个甚至更多字典,只需要把字典加入到tuple(a, b)中即可,代码改动极小。
方法3:字典推导式一行实现
如果你偏好紧凑的代码,字典推导式结合dict.get()可以一行搞定:
merged = {key: a.get(key, 0) + b.get(key, 0) for key in set(a) | set(b)}
这里set(a) | set(b)获取了两个字典所有键的并集,对每个键分别从两个字典中取值(不存在则返回0)后求和。
优点:代码简洁直观,适合快速实现;缺点是如果字典规模极大,创建键的集合会有轻微的内存开销,但依然远胜pandas方案。
方法4:Python 3.10+ 用Counter快速求和
如果你的Python版本在3.10及以上,collections.Counter可以直接处理多个字典的键值对,自动完成求和:
from collections import Counter from itertools import chain merged = dict(Counter(chain(a.items(), b.items())))
chain用来把两个字典的键值对串联成一个迭代器,Counter会自动统计每个键的总数值,最后转成普通字典即可。
性能说明
以上所有纯Python方法的性能都远超pandas方案——pandas需要创建DataFrame、执行分组聚合等重型操作,带来了大量额外开销。对于绝大多数场景,尤其是字典规模不大时,纯Python方法在速度和内存效率上的优势非常明显。
内容的提问来源于stack exchange,提问作者Amir

