You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 11:17:30