如何在Python中高效合并存在部分重复键的两个字典?
Python高效合并嵌套字典(保留所有数据)
问题背景
需要合并两个嵌套字典,要求保留所有数据——包括仅在其中一个字典中存在的键。同时由于字典可能规模很大,需要高效的实现方案。
原始字典示例
dict1 = {'user1': {'name': 'Alice', 'email': 'alice@email.com'}, 'user2': {'name': 'Bob', 'email': 'bob@email.com'}} dict2 = {'user1': {'preference': 'dark mode', 'timezone': 'EST'}, 'user3': {'preference': 'light mode', 'timezone': 'PST'}}
预期合并结果
merged_dict = {'user1': {'name': 'Alice', 'email': 'alice@email.com', 'preference': 'dark mode', 'timezone': 'EST'}, 'user2': {'name': 'Bob', 'email': 'bob@email.com'}, 'user3': {'preference': 'light mode', 'timezone': 'PST'}}
高效Pythonic实现方案
方案1:Python 3.9+ 简洁版(推荐)
利用Python 3.9引入的字典合并运算符|,结合集合运算获取所有唯一键,通过字典推导式完成合并:
# 获取所有存在的用户键(集合去重) all_user_keys = dict1.keys() | dict2.keys() # 遍历每个用户,合并其对应的内层字典 merged_dict = { user: dict1.get(user, {}) | dict2.get(user, {}) for user in all_user_keys }
- 优势:代码简洁可读性强,集合运算和字典推导均为Python内置高效操作,处理大字典时性能优异。
- 逻辑说明:
dict.get(user, {})确保当用户只在其中一个字典存在时,用空字典参与合并避免报错;|运算符会合并两个内层字典,重复键(如果有的话)会用右侧字典的值覆盖左侧。
方案2:兼容Python 3.8及以下版本
使用dict.update()方法完成合并,避免修改原始输入字典:
merged_dict = dict1.copy() # 先复制dict1的外层结构(浅复制) for user, inner_data in dict2.items(): if user in merged_dict: # 用户已存在,合并内层字典 merged_dict[user].update(inner_data) else: # 用户不存在,直接添加(复制内层字典避免修改原dict2) merged_dict[user] = inner_data.copy()
- 优势:兼容性强,
update是底层C实现的内置方法,执行效率高,适合大规模数据处理。 - 注意:如果内层字典还有更深的嵌套结构,需要改为深复制(比如用
copy.deepcopy()),但会带来一定性能开销,非必要场景推荐浅合并。
关键说明
以上两种方案均为浅合并,适用于两层嵌套字典的场景(如示例中的用户信息结构)。如果需要处理多层嵌套的字典合并,可以基于上述逻辑实现递归版本,但递归会增加额外开销,建议仅在必要时使用。
内容的提问来源于stack exchange,提问作者zuplu87
相关产品推荐
相关产品推荐

