如何筛选Python字典列表中所有值均不为None的字典
问题诊断
- 缩进错误:Python语法要求循环体内的代码必须缩进,你写的
dictLoop = lastCombination[i]等代码没有在for循环的缩进块内,会直接报错。 - 变量名错误:遍历的目标列表你写的是
lastCombination,实际你定义的源列表是dictList,变量不匹配。 - 逻辑位置错误:判断标志数组是否存在False的代码放在了字典键值对的遍历循环内,会导致每校验一个键值对就执行一次添加逻辑,还没等遍历完所有键值就提前判断,结果完全不符合预期。
- 语法小问题:你给出的示例
dictList[2]里键2后面写的是逗号,正确应该是冒号2:1。
最简实现方案
你要的需求可以直接用Python内置的all()函数实现,代码非常简洁:
showCombinationWithOutZero = [] showCombinationWithZero = [] for d in dictList: # all()会校验所有值都不是None时返回True if all(v is not None for v in d.values()): showCombinationWithOutZero.append(d) else: showCombinationWithZero.append(d)
逻辑说明
all(v is not None for v in d.values())会遍历当前字典的所有值,只有所有值都不为None时才会返回True- 不需要手动维护标志数组,内置函数执行效率更高,代码可读性也更好
标志位思路修正版
如果你要保留你原本的标志位实现逻辑,修正后代码如下:
showCombinationWithOutZero = [] showCombinationWithZero = [] for i in range(len(dictList)): dictLoop = dictList[i] flagArray = [] for k,v in dictLoop.items(): if v is None: flagArray.append(False) else: flagArray.append(True) # 注意:判断逻辑要放在字典所有键值遍历完成之后,不能放在内层循环里 if False in flagArray: showCombinationWithZero.append(dictList[i]) else: showCombinationWithOutZero.append(dictList[i])
修正点说明
- 把判断逻辑移出了内层的键值遍历循环,等所有键值都校验完再判断是否有None
- 修复了变量名、缩进错误
- 用更符合Python习惯的
False in flagArray代替了不推荐的flagArray.__contains__(False)写法
内容的提问来源于stack exchange,提问作者F M
相关产品推荐
相关产品推荐

