如何按顺序合并多个字典并将同键值相加?
字典合并:相同键值累加的简便实现
示例数据
dictA = {'A': 1, 'B': 2, 'C': 3} dictB = {'C': 1, 'D': 2, 'E': 3} dictC = {'A': 2, 'C': 4, 'E': 6, 'G': 8}
合并要求
- 相同键对应的值累加(如dictA的
'A':1与dictC的'A':2合并后为'A':3) - 遇到新键直接新增(如合并后新增键
'G')
预期结果
(注:你给出的预期结果中'G'的值为2是笔误,实际应为8)
resultDict = {'A': 3, 'B': 2, 'C': 8, 'D': 2, 'E': 9, 'G': 8}
实现方法
1. 普通单层字典的简便实现
用collections.defaultdict配合循环累加,代码简洁高效:
from collections import defaultdict def merge_dicts(*dicts): merged = defaultdict(int) for d in dicts: for k, v in d.items(): merged[k] += v return dict(merged) # 调用示例 resultDict = merge_dicts(dictA, dictB, dictC) print(resultDict) # 输出: {'A': 3, 'B': 2, 'C': 8, 'D': 2, 'E': 9, 'G': 8}
也可以用functools.reduce简化逻辑:
from functools import reduce from collections import defaultdict def accumulate_dict(merged, current): for k, v in current.items(): merged[k] += v return merged resultDict = dict(reduce(accumulate_dict, [dictA, dictB, dictC], defaultdict(int)))
2. 多层嵌套字典的处理
对于嵌套多层的字典,需要递归遍历每个层级的键值对实现累加:
def merge_nested_dicts(*dicts): merged = {} for d in dicts: for k, v in d.items(): if k in merged and isinstance(merged[k], dict) and isinstance(v, dict): merged[k] = merge_nested_dicts(merged[k], v) elif k in merged: merged[k] += v else: merged[k] = v return merged # 示例嵌套字典 nestedA = {'A': 1, 'B': {'X': 2, 'Y': 3}} nestedB = {'B': {'Y': 1, 'Z': 2}, 'C': 3} nestedC = {'A': 2, 'B': {'X': 4}, 'C': 6} # 调用后结果:{'A': 3, 'B': {'X': 6, 'Y': 4, 'Z': 2}, 'C': 9}
如果嵌套结构复杂,可使用deepmerge库(需提前安装:pip install deepmerge),自定义合并策略实现值累加:
from deepmerge import always_merger def sum_merge(config, path, base, nxt): if isinstance(base, int) and isinstance(nxt, int): return base + nxt return always_merger.merge(base, nxt) # 配置合并策略 merger = always_merger merger.add_override(sum_merge) # 合并嵌套字典 result = merger.merge(nestedA, nestedB, nestedC)
内容的提问来源于stack exchange,提问作者mrelpa
相关产品推荐
相关产品推荐

