如何实现Python嵌套字典更新时不覆盖已有同名字段的键值对
Python两层嵌套字典合并方案
你使用dict.update()无法满足需求的原因是:该方法仅做外层键维度的覆盖,只要外层键名相同,就会直接用新值替换旧值,不会自动识别值为字典的场景做深层合并。
首先注意你给出的dict_b示例存在语法笔误,多包裹了一层大括号,修正后的合法字典格式如下:
dict_b = {"1": {"1": 0, "2": "84543", "3": "34854", "5": "123439"}, "229": {"2": "71355", "12": "24751", "25": "33600", "229": 0}}
方案1:针对固定两层嵌套的最简实现
如果可以确定字典只有两层嵌套,不需要处理更深的层级,直接遍历外层键做判断即可:
import copy # 先深拷贝原dict_a,避免修改原始数据 dict_a_updated = copy.deepcopy(dict_a) for outer_key, inner_b in dict_b.items(): # 外层键同时存在且对应值都为字典时,合并内层 if outer_key in dict_a_updated and isinstance(dict_a_updated[outer_key], dict) and isinstance(inner_b, dict): dict_a_updated[outer_key].update(inner_b) # 其余情况直接新增/覆盖外层键值对 else: dict_a_updated[outer_key] = inner_b
执行后得到的dict_a_updated就和你预期的结果完全一致。
方案2:支持任意深度嵌套的通用实现
如果后续需要处理超过两层的嵌套字典,可以用递归函数实现通用深层合并:
import copy def deep_merge(dict_base, dict_new): """ 递归合并两个字典,dict_new的优先级高于dict_base 相同键对应的值都为字典时做深层合并,其余情况用dict_new的值覆盖 """ merged = copy.deepcopy(dict_base) for key, val_new in dict_new.items(): if key in merged and isinstance(merged[key], dict) and isinstance(val_new, dict): merged[key] = deep_merge(merged[key], val_new) else: merged[key] = val_new return merged # 调用方法 dict_a_updated = deep_merge(dict_a, dict_b)
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

