Python 合并两个字典的 8 种常用方法
在 Python 开发中,字典(Dictionary)是最常用的数据结构之一。经常需要处理多个字典数据的合并场景,例如配置项叠加、数据聚合等。本文详细讲解了 Python 中合并两个字典的八种主流方法,涵盖语法特性、版本兼容性、内存影响及适用场景对比。
详细讲解了 Python 中合并两个字典的八种主流方法,包括 update()、解包操作符、并集运算符、循环遍历、ChainMap、构造函数及 reduce 等。内容涵盖各方法的语法特性、版本兼容性、内存影响及适用场景对比,帮助开发者根据实际需求选择最优方案,避免常见陷阱如键值覆盖或意外修改原对象。

在 Python 开发中,字典(Dictionary)是最常用的数据结构之一。经常需要处理多个字典数据的合并场景,例如配置项叠加、数据聚合等。本文详细讲解了 Python 中合并两个字典的八种主流方法,涵盖语法特性、版本兼容性、内存影响及适用场景对比。
update() 是字典对象内置的方法,用于将另一个字典的键值对更新到当前字典中。该方法会直接修改原字典,返回值为 None。
特点:
def merge_update(dict1, dict2):
# 注意:update 返回 None,不能直接赋值给变量作为结果
dict1.update(dict2)
return dict1
dict1 = {'a': 10, 'b': 8}
dict2 = {'d': 6, 'c': 4}
result = merge_update(dict1, dict2)
print(result) # 输出:{'a': 10, 'b': 8, 'd': 6, 'c': 4}
从 Python 3.5 开始,支持使用 ** 操作符进行字典解包。这是一种简洁且常用的方式,可以生成一个新的字典。
特点:
def merge_unpack(dict1, dict2):
res = {**dict1, **dict2}
return res
dict1 = {'a': 10, 'b': 8}
dict2 = {'d': 6, 'c': 4}
print(merge_unpack(dict1, dict2)) # 输出:{'a': 10, 'b': 8, 'd': 6, 'c': 4}
Python 3.9 引入了新的字典合并运算符 |。这是目前最推荐的现代写法,语义清晰。
特点:
def merge_pipe(dict1, dict2):
res = dict1 | dict2
return res
dict1 = {'x': 10, 'y': 8}
dict2 = {'a': 6, 'b': 4}
print(merge_pipe(dict1, dict2)) # 输出:{'x': 10, 'y': 8, 'a': 6, 'b': 4}
通过遍历第二个字典的键,手动将键值对添加到第一个字典中。这种方式灵活性最高,可加入自定义逻辑。
特点:
def merge_loop(dict1, dict2):
for key in dict2:
dict1[key] = dict2[key]
return dict1
dict1 = {'x': 10, 'y': 8}
dict2 = {'a': 6, 'b': 4}
print(merge_loop(dict1, dict2)) # 输出:{'x': 10, 'y': 8, 'a': 6, 'b': 4}
collections.ChainMap 创建一个包含多个字典的单一视图。它不会真正合并数据,而是提供一个查找顺序的视图。
特点:
from collections import ChainMap
dict1 = {'a': 1, 'b': 2}
dict2 = {'c': 3, 'd': 4}
merged = ChainMap(dict1, dict2)
print(merged['a']) # 输出:1
print(merged['c']) # 输出:3
# 修改会影响底层字典
merged['c'] = 5
print(dict2['c']) # 输出:5
先复制第一个字典,再调用 update 合并第二个。这是最显式、最安全的合并方式,明确区分了源数据和目标数据。
特点:
def merge_copy_update(dict1, dict2):
merged_dict = dict1.copy()
merged_dict.update(dict2)
return merged_dict
dict1 = {'x': 10, 'y': 8}
dict2 = {'a': 6, 'b': 4}
print(merge_copy_update(dict1, dict2)) # 输出:{'x': 10, 'y': 8, 'a': 6, 'b': 4}
利用 dict.items() 返回的视图对象支持集合运算的特性(Python 3.9+),结合 dict() 构造函数合并。
特点:
dict_items 支持 | 运算。def merge_items_union(dict1, dict2):
merged_dict = dict(dict1.items() | dict2.items())
return merged_dict
dict1 = {'a': 10, 'b': 8}
dict2 = {'d': 6, 'c': 4}
print(merge_items_union(dict1, dict2)) # 输出:{'a': 10, 'b': 8, 'd': 6, 'c': 4}
使用 functools.reduce 可以将多个字典依次合并。这种方法特别适合合并列表中的多个字典。
特点:
reduce 模块。from functools import reduce
def merge_dictionaries(dict1, dict2):
merged_dict = dict1.copy()
merged_dict.update(dict2)
return merged_dict
dict1 = {'a': 10, 'b': 8}
dict2 = {'d': 6, 'c': 4}
dict_list = [dict1, dict2]
result_dict = reduce(merge_dictionaries, dict_list)
print(result_dict) # 输出:{'a': 10, 'b': 8, 'd': 6, 'c': 4}
| 方法 | 版本要求 | 是否修改原对象 | 推荐场景 |
|---|---|---|---|
| update() | 所有版本 | 是 | 允许修改原字典时 |
| ** 操作符 | 3.5+ | 否 | 通用,推荐 |
| 运算符 | 3.9+ | 否 | |
| for 循环 | 所有版本 | 是/否 | 需自定义逻辑时 |
| ChainMap | 所有版本 | 否 (视图) | 内存敏感,只读 |
| dict+copy | 所有版本 | 否 | 强调数据安全 |
| items() 并集 | 3.9+ | 否 | 高级用法 |
| reduce | 所有版本 | 否 | 合并多个字典 |
总结建议:
| 运算符,代码最简洁。{**d1, **d2} 解包法。ChainMap 优化内存。
微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online