如何判断生成器是否为空?实现字典及嵌套子字典键存在性判断
检查嵌套字典中是否存在指定键的解决方案
你已经有了一个能遍历嵌套字典(包括列表里的字典)的生成器函数,要实现布尔值判断其实很简单——只需要判断这个生成器是否能产出至少一个结果就行!
方法一:用any()快速实现
any()函数会迭代生成器,只要生成器里有元素(不管是什么),就会返回True;如果生成器为空(没有找到键),就返回False。我们可以写一个简洁的包装函数:
def has_nested_key(key, var): # 只要生成器有产出,就说明目标键存在 return any(True for _ in gen_dict_extract(key, var))
调用时直接用has_nested_key("target_key", your_nested_dict)就能得到布尔值结果。
方法二:用next()提前终止遍历(更高效)
如果你的嵌套结构很大,any()会在找到第一个匹配项后停止遍历,但用next()加异常捕获的方式可以更直观地实现“找到匹配就立刻返回”,避免不必要的后续遍历:
def has_nested_key(key, var): try: # 尝试获取生成器的第一个元素 next(gen_dict_extract(key, var)) return True except StopIteration: # 生成器为空,说明目标键不存在 return False
优化原生成器(兼容Python3)
另外注意原函数里的iteritems()是Python2的写法,在Python3里要改成items(),而且用isinstance判断类型比hasattr更可靠。可以把原生成器优化成这样,兼容性和可读性更好:
def gen_dict_extract(key, var): if isinstance(var, dict): for k, v in var.items(): if k == key: yield v # 递归遍历子字典 if isinstance(v, dict): yield from gen_dict_extract(key, v) # 遍历列表/元组里的嵌套元素 elif isinstance(v, (list, tuple)): for item in v: yield from gen_dict_extract(key, item)
这个版本用yield from简化了递归调用,同时支持元组类型的嵌套场景。
内容的提问来源于stack exchange,提问作者MelDev
相关产品推荐
相关产品推荐

