复杂字典迭代:判断指定键是否存在并输出对应值或0
解决方法:一次性判断key是否存在于任意字典中
嘿,我明白你的问题了——你之前的写法会遍历sc_dict里的每个元组,每个元素单独做判断,导致目标key不存在时,每个循环都打印一次0,所以出现了两次输出。其实核心是要先整体检查所有字典里是否存在目标key,再统一输出结果,而不是逐个元素判断后立即输出。
这里给你两种实用的解决方案:
方法1:直观循环查找(易理解)
先把列表里所有的字典提取出来,然后遍历查找目标key,找到就更新结果,最后只打印一次:
sc_dict = [('fl', {'ab': 1}), ('fl', {'abel': 1})] key_p = 'ab' # 可以替换成你要检查的key # 提取列表中所有的字典 all_dicts = [item[1] for item in sc_dict] result = 0 # 默认值设为0 for d in all_dicts: if key_p in d: result = d[key_p] break # 找到第一个匹配的key就停止遍历,提升效率 print(result)
测试效果:
- 当
key_p = 'ab',输出1 - 当
key_p = 'xyz',输出0
方法2:简洁的生成器+next函数(一行搞定)
用生成器表达式遍历所有字典,配合next()函数直接获取结果,找不到就返回默认值0:
sc_dict = [('fl', {'ab': 1}), ('fl', {'abel': 1})] key_p = 'abel' # 生成器遍历所有字典,找到key就返回对应值,否则返回0 result = next((d[key_p] for tpl in sc_dict for d in [tpl[1]] if key_p in d), 0) print(result)
这个写法更紧凑,适合追求简洁代码的场景,效果和方法1完全一致。
为什么之前的写法会重复打印0?
你之前应该是类似这样写的:
sc_dict = [('fl', {'ab': 1}), ('fl', {'abel': 1})] key_p = 'xyz' for item in sc_dict: d = item[1] if key_p in d: print(d[key_p]) else: print(0)
这种写法会逐个元素判断并输出,所以每个不包含key的字典都会触发一次print(0),自然会打印两次。而我们上面的方法是先找到结果(或确认不存在),最后只输出一次,就解决了重复打印的问题。
内容的提问来源于stack exchange,提问作者sara jones
相关产品推荐
相关产品推荐

