求基于递归/循环的通用嵌套字典值更新解决方案
递归更新多层嵌套字典(保留原结构)
需要实现一个通用方案,通过输入字典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 } ] }
方案说明
递归遍历逻辑:
- 当处理对象是字典时,遍历所有键,若键存在于
inp中则更新值,随后递归处理该键对应的嵌套结构(确保深层嵌套被覆盖)。 - 当处理对象是列表时,遍历列表中的每个元素并递归处理,保证列表内的嵌套字典也能被更新。
- 对于字符串、数字等普通值,直接跳过,不做修改。
- 当处理对象是字典时,遍历所有键,若键存在于
注意事项:
- 不要使用
dict作为变量名,这会覆盖Python内置的dict类型,引发潜在错误。 - 如果需要保留原字典不被修改,可以先对原字典做深拷贝,再对拷贝后的字典执行更新:
import copy updated_dict = copy.deepcopy(target_dict) update_nested_dict(updated_dict, inp) - 输入字典
inp中不存在于目标字典的键会被自动忽略,不会在目标字典中新增键,严格保留原结构。
- 不要使用
内容的提问来源于stack exchange,提问作者Anil Yadav
相关产品推荐
相关产品推荐

