如何基于映射字典更新嵌套字典中的指定键对应值(适配可变嵌套结构)
递归更新嵌套字典中的指定键值对
这个问题核心是处理嵌套不确定层级的数据替换,递归遍历是最适合的方案——既能处理字典又能处理列表嵌套的情况,不管数据结构多深都能覆盖到。我给你写个通用的实现,还能支持指定目标键的扩展场景:
原始数据
首先先明确我们的输入数据:
data = { "filter": { "and": [ { "or": [ { "and": [ {"category": "profile", "key": "languages", "operator": "IN", "value": "EN"}, {"category": "skill", "key": "26366", "value": 100, "operator": "EQ"}, ], }, ], }, {"or": [{"category": "skill", "key": "45165", "operator": "NE"}]}, {"or": [{"category": "skill", "key": "48834", "value": 80, "operator": "GT"}]}, {"or": [{"category": "profile", "key": "gender", "operator": "EQ", "value": "FEMALE"}]}, ], }, } new_val = {'26366': '11616', '45165': '11613', '48834': '11618'}
通用递归替换函数
这个函数会遍历所有嵌套层级,自动识别字典和列表,替换所有匹配new_val键的值:
def update_nested_data(obj, replacements): if isinstance(obj, dict): # 遍历字典的每个键值对 for k, v in obj.items(): # 如果当前值在替换映射中,直接替换 if v in replacements: obj[k] = replacements[v] # 递归处理值,处理深层嵌套 update_nested_data(v, replacements) elif isinstance(obj, list): # 遍历列表中的每个元素,递归处理 for i in range(len(obj)): update_nested_data(obj[i], replacements) return obj # 调用函数(用copy避免修改原始字典,不需要的话可以去掉.copy()) updated_data = update_nested_data(data.copy(), new_val) # 格式化打印结果 import json print(json.dumps(updated_data, indent=2))
输出结果
运行后就能得到你期望的更新后数据:
{ "filter": { "and": [ { "or": [ { "and": [ { "category": "profile", "key": "languages", "operator": "IN", "value": "EN" }, { "category": "skill", "key": "11616", "value": 100, "operator": "EQ" } ] } ] }, { "or": [ { "category": "skill", "key": "11613", "operator": "NE" } ] }, { "or": [ { "category": "skill", "key": "11618", "value": 80, "operator": "GT" } ] }, { "or": [ { "category": "profile", "key": "gender", "operator": "EQ", "value": "FEMALE" } ] } ] } }
扩展:只替换指定键名下的值
如果需要更精准的控制——比如只替换key、skill_id、filter_id这些特定键对应的值,可以修改函数增加目标键参数:
def update_nested_data(obj, replacements, target_keys=None): # 默认目标键列表,可根据需求修改 target_keys = target_keys or ["key", "skill_id", "filter_id"] if isinstance(obj, dict): for k, v in obj.items(): # 只在目标键列表中,且值匹配时才替换 if k in target_keys and v in replacements: obj[k] = replacements[v] update_nested_data(v, replacements, target_keys) elif isinstance(obj, list): for i in range(len(obj)): update_nested_data(obj[i], replacements, target_keys) return obj
内容的提问来源于stack exchange,提问作者Brze
相关产品推荐
相关产品推荐

