如何递归搜索含嵌套列表的Python字典并添加指定键值对?
递归搜索嵌套字典并添加键值对
需求描述
需要递归搜索包含嵌套列表的Python字典:键"c"的值是一个或多个字典组成的列表,结构可多层嵌套(嵌套深度不超过5层)。目标是找到所有ref='hij789'的字典(无论嵌套深度),并为每个该字典添加缺失的'b'='something'键值对。
示例字典结构
{ 'ref': 'abc123', 'a': 'something', 'b': 'something', 'c': [{ 'ref': 'def456', 'a': 'something', 'b': 'something', 'c': [{ 'ref': 'hij789', 'a': 'something' }] },{ 'ref': 'klm012', 'a': 'something', 'b': 'something', 'c': [{ 'ref': 'nop345', 'a': 'something', 'b': 'something', 'c': [{ 'ref': 'hij789', 'a': 'something' }] }] },{ 'ref': 'qrs678', 'a': 'something', 'b': 'something', 'c': [{ 'ref': 'tuv901', 'a': 'something' }] }] }
尝试过的代码(仅支持第一层嵌套)
l = next((n for n in mydict['c'] if n['ref'] == 'myref'), None) l['b'] = 'somevalue'
解决方案:递归遍历函数
可以写一个递归函数,遍历所有层级的字典,检查目标条件并修改字典:
def update_target_dicts(data): # 处理单个字典 if isinstance(data, dict): # 检查当前字典是否符合修改条件 if data.get('ref') == 'hij789' and 'b' not in data: data['b'] = 'something' # 递归处理嵌套的c列表 if 'c' in data and isinstance(data['c'], list): for item in data['c']: update_target_dicts(item) # 处理字典列表 elif isinstance(data, list): for item in data: update_target_dicts(item)
使用方法
直接调用函数传入目标字典即可:
# 假设你的字典存储在my_dict变量中 update_target_dicts(my_dict)
逻辑说明
- 函数先判断传入数据的类型:
- 若为字典,先检查是否是目标
ref='hij789'且缺失b键,满足则添加键值对;接着检查是否存在嵌套的c列表,遍历列表元素递归处理。 - 若为列表,遍历每个元素递归调用函数,覆盖所有层级的嵌套内容。
- 若为字典,先检查是否是目标
- 该方法无需关注具体嵌套深度,能自动处理所有符合结构的层级。
内容的提问来源于stack exchange,提问作者samc1979
相关产品推荐
相关产品推荐

