检查Python列表中是否有任何项为None(但包括零)

94
我想进行一个简单的测试,如果列表中的任何一个结果为None,则返回True。但是,我希望0''不会导致返回True
list_1 = [0, 1, None, 4]
list_2 = [0, 1, 3, 4]

any(list_1) is None
>>>False
any(list_2) is None
>>>False

正如您所看到的,any() 函数在这个上下文中并没有帮助。


5
注意,当前的代码表示“如果我的调用any的结果恰好是None”(鉴于它将返回TrueFalse或引发异常,这将永远不会发生)。 - jonrsharpe
2个回答

178

对于list对象,可以直接使用成员测试:

None in list_1

any() 相似,对于一个 list 的成员检验将扫描所有元素,但会在找到匹配项后立即返回结果。

any() 返回 True 或者 False,永远不会返回 None,因此你的测试语句 any(list_1) is None 肯定行不通。你需要传入一个生成器表达式给 any() 进行迭代:

any(elem is None for elem in list_1)

我引用一下这段代码:如果可迭代对象中有任意一个元素为真,则返回True。如果可迭代对象为空,则返回False。所以使用那个代码确实不正确。 - d6bels
@Lattyware:我认为d6bels指的是 is None 测试。 - Martijn Pieters
9
当列表包含Numpy数组时,这会引起麻烦。Tom Cornebize有更好的解决方案。 - frankliuao
2
但是在numpy数组上,你可能想要使用numpy.any(),而不是在数值数组中存储None对象。 - Martijn Pieters
1
请注意,如果列表元素之一是 numpy 数组,则此方法不起作用。在这种情况下,请先对数组使用 list() 方法。 - PDiracDelta
显示剩余4条评论

26
list_1 = [0, 1, None, 4]

list_2 = [0, 1, 3, 4]

any(x is None for x in list_1)
>>>True

any(x is None for x in list_2)
>>>False

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接