
本文介绍在 python 中高效合并两个字典并按需处理重复键的多种方法,涵盖内置运算符、字典推导式及可扩展函数实现,支持值相加、取最大值、列表聚合等自定义逻辑,兼顾性能与可读性。
本文介绍在 python 中高效合并两个字典并按需处理重复键的多种方法,涵盖内置运算符、字典推导式及可扩展函数实现,支持值相加、取最大值、列表聚合等自定义逻辑,兼顾性能与可读性。
在 Python 3.9+ 中,| 运算符提供了简洁的字典合并语法(如 dict1 | dict2),但其默认行为是后字典覆盖前字典的同名键值,无法满足对重复键进行自定义处理(如求和、取较大值、合并为列表等)的需求。Python 3.8 及更早版本虽不支持 |,但仍可通过 ** 解包或 collections.ChainMap 等方式实现基础合并——但同样缺乏原生重复键策略支持。因此,构建一个可控、可复用、高效且符合 Pythonic 风格的合并函数至关重要。
推荐方案:分步合并 + 显式冲突处理(清晰、可维护、兼容 Python 3.8+)
以下函数采用“先粗合并、再精修”的两阶段策略,逻辑直观、易于调试,并完美兼容 Python 3.8:
def merge_dicts(d1: dict, d2: dict, on_duplicate=lambda v1, v2: v2) -> dict:
"""
合并两个字典,对重复键应用自定义处理逻辑。
Args:
d1, d2: 待合并字典
on_duplicate: 接收 (v1, v2) 的 callable,返回处理后的值;
默认行为为保留 d2 的值(即覆盖)
Returns:
合并后的新字典(不修改原字典)
"""
# 第一步:创建基础合并(Python 3.9+ 可用 d1 | d2;3.8 用 {**d1, **d2})
merged = {**d1, **d2} # 兼容 Python 3.8
# 第二步:识别交集键,并按策略重设值
common_keys = d1.keys() & d2.keys() # set intersection,高效且可读
for key in common_keys:
merged[key] = on_duplicate(d1[key], d2[key])
return merged✅ 使用示例:
dict1 = {'a': 1, 'b': 2}
dict2 = {'b': 3, 'c': 4}
# 场景1:值相加
print(merge_dicts(dict1, dict2, on_duplicate=lambda x, y: x + y))
# 输出: {'a': 1, 'b': 5, 'c': 4}
# 场景2:取较大值
print(merge_dicts(dict1, dict2, on_duplicate=max))
# 输出: {'a': 1, 'b': 3, 'c': 4}
# 场景3:合并为列表(保留所有值)
print(merge_dicts(dict1, dict2, on_duplicate=lambda x, y: [x, y]))
# 输出: {'a': 1, 'b': [2, 3], 'c': 4}替代方案:单表达式字典推导式(简洁但稍重)
若偏好函数式风格或需一行解决,可使用如下推导式(同样兼容 Python 3.8+):
仅使用 Python 将 Claw Code 虚拟化框架与 OpenClaw 集成,提供 184 种工具和 200 多条命令,用于安全分析和代码质量...
立即学习“Python免费学习笔记(深入)”;
def merge_dicts_oneliner(d1, d2, on_duplicate=lambda v1, v2: v2):
all_keys = d1.keys() | d2.keys()
return {
k: on_duplicate(d1[k], d2[k]) if k in d1 and k in d2
else d1.get(k, d2.get(k))
for k in all_keys
}⚠️ 注意事项:
- d1.keys() & d2.keys() 比 set(d1.keys()) & set(d2.keys()) 更高效,因字典视图本身支持集合操作;
- 所有方案均返回新字典,不修改输入字典,符合函数式编程原则;
- 若需深度合并嵌套字典,请考虑 deepmerge 库或递归实现,本方案仅处理一级键值;
- 在高频调用场景中,避免在 on_duplicate 中执行耗时操作(如 I/O 或复杂计算),以保持整体效率。
总结
处理字典重复键的核心在于分离“合并结构”与“解决冲突”两个关注点。推荐优先使用 merge_dicts 分步实现:它语义清晰、易于单元测试、便于扩展(例如添加日志、类型检查或异常处理),且在 Python 3.8–3.12 全系列中表现一致。通过传入不同的 on_duplicate 函数,即可灵活适配业务需求——无论是统计累加、优先级选择,还是审计留痕,均能一码应对。

















