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

如何实现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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 15:54:01