Python中检查元组是否有任何空/None值的最佳方法是什么?

40

如何最好/最有效地检查所有元组值?我需要遍历所有元组项并进行检查,还是有更好的方法?

例如:

t1 = (1, 2, 'abc')
t2 = ('', 2, 3)
t3 = (0.0, 3, 5)
t4 = (4, 3, None)

检查这些元组,除了t1之外的每个元组都应返回True,这意味着存在所谓的空值。

P.S. 还有这个问题:使用Python测试元组是否仅包含None值,但它只涉及到None值。


哦,那就可以了 :) - Andrius
5个回答

62

这很容易:

not all(t1)

仅当t1中所有值都不为空/非零且不为None时,返回Falseall会短路,因此它只需检查第一个空元素之前的元素,这使得它非常快速。


2
同样适用于namedtuple(因为它是一个子类,当然可以)=) - jpmc26
@TimPietzcke 我认为它还会检查 False(布尔)值,如果元组中的一个值为 False,则 all(t1) 将返回 False。 - sau
@sau:是的,False 就是 0 - Tim Pietzcker

21

已提供使用所有答案:

not all(t1)

然而在t3这种情况下,这将返回True,因为其中一个值是0:

t3 = (0.0, 3, 5)

'all' 内置关键字用于检查给定可迭代对象中的所有值是否为评估为负布尔值(False)的值。0、0.0、'' 和 None 均评估为 False。

如果您只想测试 None(如问题标题所示),请使用以下代码:

any(map(lambda x: x is None, t3))

如果t3中的元素中有任何一个是None,则返回True,如果它们都不是,则返回False。


5

如果你想检查包含这样元组的元组中是否存在空值:

t1 = (('', ''), ('', ''))
t2 = ((0.0, 0.0), (0.0, 0.0))
t3 = ((None, None), (None, None))

你可以使用以下方法:

not all(map(lambda x: all(x), t1))

否则,如果您想知道是否存在至少一个正值,则可以使用以下方法:
any(map(lambda x: any(x), t1))

4

针对你的特定情况,你可以使用all()函数,它会检查列表中所有值是真还是假。请注意,在Python中,None、空字符串和0被认为是假。

因此 -

>>> t1 = (1, 2, 'abc')
>>> t2 = ('', 2, 3)
>>> t3 = (0.0, 3, 5)
>>> t4 = (4, 3, None)
>>> all(t1)
True
>>> all(t2)
False
>>> all(t3)
False
>>> all(t4)
False
>>> if '':
...     print("Hello")
...
>>> if 0:
...     print("Hello")

3
None in (None,2,"a")

None in (1,2,"a")

"" in (1,2,"")

真实的

"" in (None,2,"a")

import numpy

np.nan in (1,2, np.nan)

np.nan in (1,2, "a")


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