
本文介绍使用 Python collections.Counter 合并多个字典、自动累加同名键值的简洁方法,适用于大规模数据场景,代码简短、性能优异且无需嵌套循环。
本文介绍使用 python `collections.counter` 合并多个字典、自动累加同名键值的简洁方法,适用于大规模数据场景,代码简短、性能优异且无需嵌套循环。
在实际开发中,常需将多个结构相似的字典按键合并——对重复键的值求和,对新键直接保留。例如有三个字典:
dictA = {'A': 1, 'B': 2, 'C': 3}
dictB = {'C': 1, 'D': 2, 'E': 3}
dictC = {'A': 2, 'C': 4, 'E': 6, 'G': 8}期望结果为:{'A': 3, 'B': 2, 'C': 8, 'D': 2, 'E': 9, 'G': 8}(注意:原文示例中 'G': 2 有误,正确应为 'G': 8,因仅 dictC 含 'G': 8,无其他字典覆盖)。
最优雅的解决方案是使用 collections.Counter —— 它专为计数与累加设计,支持直接相加操作:
from collections import Counter
dictA = {'A': 1, 'B': 2, 'C': 3}
dictB = {'C': 1, 'D': 2, 'E': 3}
dictC = {'A': 2, 'C': 4, 'E': 6, 'G': 8}
result = dict(Counter(dictA) + Counter(dictB) + Counter(dictC))
print(result)
# 输出: {'A': 3, 'B': 2, 'C': 8, 'D': 2, 'E': 9, 'G': 8}对于任意数量字典,推荐使用 sum() 配合 map 实现泛化处理:
dicts = [dictA, dictB, dictC] result = dict(sum(map(Counter, dicts), Counter()))
此处 sum(..., Counter()) 的第二个参数提供初始空 Counter,确保加法从零开始,避免 TypeError。
⚠️ 注意事项:
- Counter 本质是 dict 子类,支持所有字典操作;若需纯 dict 类型,显式调用 dict(counter_obj) 即可;
- Counter 对非数值类型(如字符串)默认支持,但加法仅对可加类型(如 int, float)有意义;
- 若字典含嵌套结构(如多层嵌套字典),Counter 不会递归处理——此时需自定义递归合并函数,或改用 deepmerge 等第三方库;
- 性能优势显著:相比手动遍历+判断,Counter 底层基于哈希优化,时间复杂度接近 O(N),适合处理万级键值对。
总结:当目标是「按键聚合数值」时,Counter 是 Python 标准库中最轻量、最直观的工具。它让原本需要多层循环和条件判断的逻辑,压缩为一行可读性强、易于维护的表达式。

















