如何合并两个字典?

访客 python案例 5

完整指南与高效方法

目录导读

  1. 什么是字典合并?
  2. Python中合并字典的5种主流方法
  3. 不同合并方式的性能对比
  4. 常见问题与陷阱(问答)
  5. 最佳实践与总结

什么是字典合并?

在编程(尤其是Python)中,字典(Dictionary)是一种键值对数据结构,合并两个字典意味着将第二个字典中的键值对添加到第一个字典中,或者创建一个新的字典包含两者数据,如果键重复,则后一个字典的值会覆盖前一个的值。


字典A = {“a”:1, “b”:2}
字典B = {“b”:3, “c”:4}
合并后 → {“a”:1, “b”:3, “c”:4}(b的值被覆盖)


Python中合并字典的5种主流方法

使用 update() 方法(最经典)
dict1 = {"a": 1, "b": 2}
dict2 = {"b": 3, "c": 4}
dict1.update(dict2)
print(dict1)  # 输出:{'a': 1, 'b': 3, 'c': 4}

优点:直接修改原字典,高效。
缺点:会破坏原字典对象,需谨慎。

使用 解包操作(Python 3.5+)
merged = {**dict1, **dict2}

优点:语法简洁,生成新字典,不修改原数据。
缺点:如果键太多,可读性略有下降。

使用 操作符(Python 3.9+)
merged = dict1 | dict2

优点:最直观、最推荐的合并方式,类似数学符号。
缺点:需要Python 3.9+版本。

字典推导式
merged = {k: v for d in (dict1, dict2) for k, v in d.items()}

优点:灵活,可自定义合并逻辑(如处理重复键)。
缺点:语法相对复杂,性能中等。

使用 collections.ChainMap
from collections import ChainMap
merged = dict(ChainMap(dict2, dict1))  # 注意顺序影响覆盖

优点:适合需要多层查找或保留原始结构的场景。
缺点:转换后变为普通字典,且性能不如直接合并。


不同合并方式的性能对比

方法 Python版本要求 是否修改原字典 性能(百万次) 推荐场景
update() 任何版本 最快 无需保留原数据
**解包 5+ 通用
| 操作符 9+ 极快 现代项目首选
推导式 任何版本 中等 需自定义逻辑
ChainMap 任何版本 稍慢 多层字典结构

测试数据:在Python 3.10中,合并两个大小为1000的字典,操作符耗时约0.02秒,update()约0.015秒。


常见问题与陷阱(问答)

Q1:如果两个字典有相同的键,如何保留两个值?
A:默认后一个覆盖前一个,若要保留全部值,需自定义合并逻辑,例如将重复键的值转为列表:

from collections import defaultdict
merged = defaultdict(list)
for d in (dict1, dict2):
    for k, v in d.items():
        merged[k].append(v)

Q2:合并嵌套字典(如json结构)时需要注意什么?
A:简单方法(如)只会合并第一层,深层嵌套需要递归合并,例如使用deepmerge库或自定义递归函数。

Q3:为什么我用update()后原字典变了?
A:因为update()直接修改调用它的字典对象,如果你需要保留原数据,请使用或{**dict1, **dict2}

Q4:字典合并时顺序是否重要?
A:在Python 3.7+中字典保持插入顺序,合并时后面的字典覆盖前面的,所以顺序影响覆盖结果。

Q5:合并空字典会报错吗?
A:不会,任何空字典与另一个字典合并,结果就是非空字典本身。


最佳实践与总结

  1. 首选Python 3.9+的 操作符:语法最清晰、性能优秀、不修改原数据。
  2. 若需兼容旧版本:使用 {**dict1, **dict2}update()(注意副作用)。
  3. 处理嵌套字典:使用 copy.deepcopy 后再合并,或专用库如 deepmerge
  4. 保持代码可读性:避免过度复杂的一行合并,尤其是推导式嵌套时。
  5. 性能敏感场景:使用 update() 修改原字典最快,但需确认不保留原对象。

最终建议:在实际项目中,优先使用 merged = dict1 | dict2 方式,简单、安全、易维护,如果你的团队仍在使用Python 3.8及以下,则推荐 {**dict1, **dict2} 语法。


延伸阅读:如果你需要合并多个字典(多于两个),以下方法非常高效:

merged = {}
for d in list_of_dicts:
    merged.update(d)
# 或使用 reduce
from functools import reduce
merged = reduce(lambda a, b: {**a, **b}, list_of_dicts)

掌握这些方法后,你可以在数据处理、配置管理、API响应整合等场景中高效工作,希望本文能帮助你彻底理解字典合并的核心逻辑!

标签: 键值对

抱歉,评论功能暂时关闭!