如何在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下的所有子键,避免遗漏任何需要处理的项;
- 逐个构建子字典:
- 检查子键在dict1中是否存在,存在则添加
dict_1_value键值对; - 检查子键在dict2中是否存在,存在则添加
dict_2_value键值对; - 将dict3中与该子键同名的字典内容合并进来,用
update方法避免覆盖已有键;
- 检查子键在dict1中是否存在,存在则添加
- 最后将所有子字典整合到对应顶层键下,得到目标结构。
关于你尝试过的方法
{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
相关产品推荐
相关产品推荐

