如何基于另一个字典更新Python字典且保留原有嵌套键值信息
Python嵌套字典深度合并方案
问题原因
你使用的{**dic_1, **dic_2}属于浅合并逻辑,仅会对字典的顶层键值对做覆盖替换。如果顶层键对应的value是嵌套字典,会直接用dic_2的对应嵌套字典整体替换,不会进入嵌套结构做增量合并,因此会丢失dic_1中a键下的"b": "b"数据。
解决方法
我们可以通过递归逻辑实现深度合并,既保留原字典的嵌套字段,又用新字典的数值做覆盖、新增:
1. 自定义递归合并函数
def deep_merge(base_dict, update_dict): # 复制基础字典,避免修改原字典数据 merged = base_dict.copy() for key, value in update_dict.items(): # 当两个字典的同key值都是字典类型时,递归合并嵌套结构 if key in merged and isinstance(merged[key], dict) and isinstance(value, dict): merged[key] = deep_merge(merged[key], value) # 其他情况直接用更新字典的值覆盖/新增 else: merged[key] = value return merged
2. 调用测试
dic_1 = {"a": {"a": "a", "b": "b"}, "b": "b"} dic_2 = {"a": {"a": "b", "c": "b"}, "b": "c" } dic_3 = deep_merge(dic_1, dic_2) print(dic_3) # 输出结果:{'a': {'a': 'b', 'b': 'b', 'c': 'b'}, 'b': 'c'}
注意事项
- 上述实现不会修改原始的
dic_1和dic_2,返回的是独立的新字典 - 支持任意层级的嵌套字典合并,无需提前确定嵌套深度
- 如果项目允许引入第三方依赖,也可以直接使用
deepmerge等开源库的成熟实现,不用自行封装函数。
内容的提问来源于stack exchange,提问作者smallbirds
相关产品推荐
相关产品推荐

