
本文介绍一种健壮、通用的字典合并方法:当键冲突时,自动将所有对应值(无论是否为列表)统一归集为列表,避免数据丢失或类型错误。
本文介绍一种健壮、通用的字典合并方法:当键冲突时,自动将所有对应值(无论是否为列表)统一归集为列表,避免数据丢失或类型错误。
在 Python 中合并两个字典时,若仅用 update() 或解包(如 {**d1, **d2}),后出现的键值会直接覆盖前一个,导致数据丢失;而简单地将值转为列表(如 [v1, v2])又无法兼容原始值已是列表的情况(例如 [1] 与 3 合并应得 [1, 3],而非 [[1], 3])。因此,需设计一个类型感知的归集逻辑。
推荐使用 collections.defaultdict(list) 实现清晰、高效且可扩展的合并策略:
from collections import defaultdict
def merge_dicts(dict1, dict2):
"""
安全合并两个字典:对相同键的所有值(无论是否为列表)统一归集到一个列表中。
支持嵌套结构以外的任意标量或列表值。
"""
merged = defaultdict(list)
for d in (dict1, dict2):
for key, value in d.items():
if isinstance(value, list):
merged[key].extend(value) # 展开已有列表
else:
merged[key].append(value) # 单值追加
return dict(merged)
# 示例 1:基础数值合并
dict1 = {'a': 1, 'b': 2, 'c': 3}
dict2 = {'b': 3, 'c': 4, 'd': 5}
print(merge_dicts(dict1, dict2))
# 输出: {'a': [1], 'b': [2, 3], 'c': [3, 4], 'd': [5]}
# 示例 2:混合列表与标量(题设难点场景)
dict1 = {'a': [1], 'b': 2}
dict2 = {'a': 3, 'b': [4], 'c': 5}
print(merge_dicts(dict1, dict2))
# 输出: {'a': [1, 3], 'b': [2, 4], 'c': [5]}✅ 关键优势:
SkillSub Pro - Python 题解与代码注释双功能技能功能概述SkillSub Pro - Python 题解与代码注释双功能技能是一项面向实际任务的技能,主要用于SkillSub Pro 是一个 Python 题解生成与代码注释的 双功能合体技能 ,专为学生、算法学习者和开发者设计;✅ 一个技能,两种用途 :;核心要点📝 题解模式 :输入题目/题号,自动生成完整 Python 题解(含详细注释、解题思路、复杂度分析);💬 注释模式 :输入 Python 代码,自动添加详细中。它将相关步骤、
- 自动识别并展开已有列表(extend),避免嵌套列表;
- 对非列表值统一 append,保证结果一致性;
- 使用 defaultdict 省去手动键存在性检查,代码更简洁;
- 返回标准 dict,兼容所有下游操作。
⚠️ 注意事项:
立即学习“Python免费学习笔记(深入)”;
- 本方案不递归处理嵌套字典(如 {'x': {'y': 1}}),如需深度合并,请考虑 deepmerge 等专用库;
- 若需保留原始值类型(如单值不强制转为单元素列表),可在返回前添加后处理逻辑(例如:{k: v[0] if len(v) == 1 else v for k, v in merged.items()});
- 多于两个字典时,可轻松扩展为 *dicts 参数:for d in dicts:。
该方法兼顾可读性、鲁棒性与 Pythonic 风格,是处理“键冲突需归集”类需求的首选实践。

















