检查所有元组值的最佳/最有效方法是什么?我是否需要迭代所有元组项并检查或者是否有更好的方法?
例如:
t1 = (1, 2, 'abc')
t2 = ('', 2, 3)
t3 = (0.0, 3, 5)
t4 = (4, 3, None)
检查这些元组,除t1
之外的每个元组都应该返回True,这意味着有所谓的空值。
P.S。有这个问题:Test if tuple contains only None values with Python,但它只是关于无值
答案 0 :(得分:29)
非常简单:
not all(t1)
仅当False
中的所有值均为非空/非零而非t1
时,才会返回None
。 all
短路,所以它只需要检查第一个空元素,这会使它非常快。
答案 1 :(得分:5)
提供了使用all的答案:
not all(t1)
但是在像t3这样的情况下,这将返回True,因为其中一个值为0:
t3 = (0.0, 3, 5)
'all'内置关键字检查给定iterable的所有值是否为计算为负布尔值的值(False)。 0,0.0,''和None都评估为False。
如果您只想测试无(如问题标题所示),则可行:
any(map(lambda x: x is None, t3))
如果t3的任何元素为None,则返回True;如果没有,则返回False。
答案 2 :(得分:1)
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")
错误
答案 3 :(得分:0)
对于您的特定情况,您可以使用all()
函数,它检查列表的所有值是true还是false,请注意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")
答案 4 :(得分:0)
如果有机会想检查包含这样的元组的元组中是否有空值:
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))