在可变嵌套的列表与字典结构中查找指定字符串(生成器实现求助)
解决嵌套混合结构中查找指定字符串的生成器方案
嘿,我懂你碰到的麻烦了——这种一会儿是字典、一会儿是列表,还可能层层嵌套的可变数据结构,确实容易让人在迭代时摸不着头脑。生成器确实是处理这类问题的绝佳选择,它能按需遍历,不会一次性把整个结构塞进内存,特别适合你这种结构不确定的场景。
我先给你一个能解决问题的生成器实现,然后拆解一下关键逻辑:
def find_in_nested(data, target): # 处理字典:遍历所有值 if isinstance(data, dict): for value in data.values(): yield from find_in_nested(value, target) # 处理列表/元组这类序列(可扩展到其他可迭代非字符串类型) elif isinstance(data, (list, tuple)): for item in data: yield from find_in_nested(item, target) # 处理字符串:检查是否匹配目标 elif isinstance(data, str): if data == target: yield data # 其他类型(数字、布尔值等)直接跳过 else: pass
关键逻辑说明:
- 字典处理:我们只关心字典里的值,所以遍历
data.values(),用yield from把递归生成器的结果传递出来。 - 序列处理:针对列表、元组这类有序结构,逐个遍历元素,同样递归处理每个元素。
- 字符串判断:这里一定要单独判断字符串!如果直接用“是否可迭代”来判断,会把字符串当成可迭代对象,导致递归遍历每个字符,这显然不是我们想要的。
- 其他类型:像数字、布尔值这类非字符串、非容器的类型,直接跳过就行。
用你的示例数据测试一下:
# 你的示例数据(注意变量名别用list,这是Python内置类型) sample_data = { 'foo': [1,2,3,4], 'bar': { 'something': 'value', 'something else': 'value' }, 'anotherlist': [5,6,7,8] } # 查找目标字符串'value' for match in find_in_nested(sample_data, 'value'): print(match)
运行后会输出两次value,正好对应bar字典里的两个值。
扩展小技巧(可选):
如果你不仅想要找到目标字符串,还想知道它在嵌套结构里的路径(比如bar['something']或者anotherlist[2]),可以修改生成器,让它返回路径和匹配值的元组:
def find_in_nested_with_path(data, target, path=None): if path is None: path = [] if isinstance(data, dict): for key, value in data.items(): new_path = path + [key] yield from find_in_nested_with_path(value, target, new_path) elif isinstance(data, (list, tuple)): for idx, item in enumerate(data): new_path = path + [idx] yield from find_in_nested_with_path(item, target, new_path) elif isinstance(data, str): if data == target: yield (path, data) else: pass
调用这个版本的话,会返回类似(['bar', 'something'], 'value')的结果,能清楚看到匹配值的位置。
内容的提问来源于stack exchange,提问作者Jacek Perry
相关产品推荐
相关产品推荐

