
本文介绍使用 Python 的 collections.Counter 高效合并多个字典:自动累加同名键的值,保留所有键,代码简洁且性能优异,尤其适合处理大规模或动态数量的字典。
本文介绍使用 python 的 `collections.counter` 高效合并多个字典:自动累加同名键的值,保留所有键,代码简洁且性能优异,尤其适合处理大规模或动态数量的字典。
在数据处理中,常需将多个结构相似的字典按键聚合——例如统计多组实验结果、合并配置项或累加时间序列指标。核心需求是:对相同键的值求和,对新键直接添加,不丢失任何条目。手动遍历嵌套循环不仅冗长易错,面对大量字典时性能也显著下降。
collections.Counter 是专为此类计数/累加场景设计的工具类,它继承自 dict,支持直接相加(+),且对缺失键默认返回 0,天然适配字典合并逻辑。
以下是最简洁、可扩展的实现方式:
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_counter = Counter(dictA) + Counter(dictB) + Counter(dictC)
# 方式二:通用化处理任意数量字典(推荐)
dicts = [dictA, dictB, dictC]
result_counter = sum(map(Counter, dicts), Counter())
# 转为普通 dict(如接口强制要求 dict 类型)
result_dict = dict(result_counter)
print(result_dict)
# 输出: {'A': 3, 'B': 2, 'C': 8, 'D': 2, 'E': 9, 'G': 8}✅ 关键优势说明:
- sum(..., Counter()) 中的 start=Counter() 是必需的——它提供初始空计数器,避免 sum 默认用 0 导致类型错误;
- Counter 对未出现的键自动视为 0,因此 Counter({'A':1}) + Counter({'B':2}) 自然得到 {'A':1, 'B':2};
- 时间复杂度为 O(N),N 为所有字典中键值对总数,远优于多层嵌套 for 循环的潜在 O(N²);
- 支持链式操作:result_counter.most_common(3) 可快速获取 Top3 键值对。
⚠️ 注意事项:
- Counter 的键必须是可哈希类型(如字符串、数字、元组),不支持列表或字典作为键;
- 若原始字典含非数值值(如字符串),Counter 相加会抛出 TypeError,需提前校验或转换;
- 如需深度合并嵌套字典(如 {'x': {'y': 1}}),Counter 不适用,应改用递归合并方案(如 deepmerge 库)。
综上,当目标是「扁平字典的键值累加」时,Counter 是 Python 标准库中最优雅、最高效的选择——三行代码解决复杂聚合,兼顾可读性与工程健壮性。

















