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

求基于递归/循环的通用嵌套字典值更新解决方案

递归更新多层嵌套字典(保留原结构)

需要实现一个通用方案,通过输入字典inp中的值更新一个多层嵌套的目标字典,要求严格保留原字典的结构(包括嵌套的字典、列表等),且方案适用于任意层级的嵌套场景,而非仅针对给定示例。

递归实现方案

我们可以编写一个递归函数,遍历目标字典的所有层级,匹配inp中的键名并更新对应的值。这种方法能自然处理任意深度的嵌套结构,包括字典嵌套字典、字典嵌套列表、列表嵌套字典等场景。

代码实现

def update_nested_dict(target, inp):
    # 处理字典类型
    if isinstance(target, dict):
        for key, value in target.items():
            # 如果当前键在输入字典中,更新值
            if key in inp:
                target[key] = inp[key]
            # 递归处理当前键对应的嵌套结构
            update_nested_dict(value, inp)
    # 处理列表类型
    elif isinstance(target, list):
        for item in target:
            # 递归处理列表中的每个元素(可能是字典或其他嵌套结构)
            update_nested_dict(item, inp)

# 目标字典(避免使用内置类型名dict作为变量名)
target_dict = {
    "name": "john",
    "quality": {
        "type1": "honest",
        "type2": "clever"
    },
    "marks": [
        {
            "english": 34
        },
        {
            "math": 90
        }
    ]
}

# 输入更新字典
inp = {
    "name": "jack",
    "type1": "dumb",
    "type2": "liar",
    "english": 28,
    "math": 89
}

# 执行更新
update_nested_dict(target_dict, inp)

# 输出更新后的字典
print(target_dict)

运行结果

{
    "name": "jack",
    "quality": {
        "type1": "dumb",
        "type2": "liar"
    },
    "marks": [
        {
            "english": 28
        },
        {
            "math": 89
        }
    ]
}

方案说明

  1. 递归遍历逻辑:

    • 当处理对象是字典时,遍历所有键,若键存在于inp中则更新值,随后递归处理该键对应的嵌套结构(确保深层嵌套被覆盖)。
    • 当处理对象是列表时,遍历列表中的每个元素并递归处理,保证列表内的嵌套字典也能被更新。
    • 对于字符串、数字等普通值,直接跳过,不做修改。
  2. 注意事项:

    • 不要使用dict作为变量名,这会覆盖Python内置的dict类型,引发潜在错误。
    • 如果需要保留原字典不被修改,可以先对原字典做深拷贝,再对拷贝后的字典执行更新:
      import copy
      updated_dict = copy.deepcopy(target_dict)
      update_nested_dict(updated_dict, inp)
      
    • 输入字典inp中不存在于目标字典的键会被自动忽略,不会在目标字典中新增键,严格保留原结构。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 19:15:50