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

如何在Python中合并多个不同层级的嵌套字典?

解决方案

可以通过自定义函数实现这种嵌套字典的合并逻辑,具体代码如下:

def merge_nested_dicts(dict1, dict2, dict3):
    main_dict = {}
    # 遍历dict1和dict2共有的顶层键(对应目标结果的顶层结构)
    for top_key in dict1.keys() & dict2.keys():
        main_dict[top_key] = {}
        # 收集当前顶层键下所有子键(整合dict1和dict2的子键)
        sub_keys = set(dict1.get(top_key, {}).keys()) | set(dict2.get(top_key, {}).keys())
        for sub_key in sub_keys:
            sub_dict = {}
            # 添加dict1中的对应值(存在则添加)
            if sub_key in dict1.get(top_key, {}):
                sub_dict['dict_1_value'] = dict1[top_key][sub_key]
            # 添加dict2中的对应值(存在则添加)
            if sub_key in dict2.get(top_key, {}):
                sub_dict['dict_2_value'] = dict2[top_key][sub_key]
            # 合并dict3中同子键的内容(存在则合并)
            if sub_key in dict3:
                sub_dict.update(dict3[sub_key])
            main_dict[top_key][sub_key] = sub_dict
    return main_dict

# 测试示例数据
dict_1={'D': {'D': '1','B': '2','A': '3'},'A': {'A': '5','J': '6'}}
dict_2={'D': {'D': '7', 'B': '8', 'C': '9'},'A': {'A': '12', 'C':'13'}}
dict_3={'D': {'test1': '14','test2': '3'},'B': {'test1': '21','test2': '16'},'A': {'test1': '3','test2': '2'},'J': {'test1': '15','test2': '3'}, 'C':{'test1': '44','test2': '33'}}

main_dict = merge_nested_dicts(dict_1, dict_2, dict_3)

# 格式化输出结果
import pprint
pprint.pprint(main_dict)

代码说明

  • 先锁定dict1和dict2共有的顶层键(示例中为D、A),保证顶层结构和目标一致;
  • 对每个顶层键,整合dict1和dict2下的所有子键,避免遗漏任何需要处理的项;
  • 逐个构建子字典:
    1. 检查子键在dict1中是否存在,存在则添加dict_1_value键值对;
    2. 检查子键在dict2中是否存在,存在则添加dict_2_value键值对;
    3. 将dict3中与该子键同名的字典内容合并进来,用update方法避免覆盖已有键;
  • 最后将所有子字典整合到对应顶层键下,得到目标结构。

关于你尝试过的方法

{k: v | dict_2[k] for k, v in dict_1.items()}或dict(**dict_1,**dict_2)这类方法本质是用后字典覆盖前字典的重复键,而且无法自动将原有值重命名为dict_1_value、dict_2_value,因此必须通过自定义逻辑逐层处理键值对才能满足需求。


内容的提问来源于stack exchange,提问作者H_H

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 04:15:48