我在想是否可以断言列表中的所有元素都不是None
,这样当a = None
时就会产生一个错误。
示例列表为[a, b, c]
我尝试过assert [a, b, c] is not None
,但如果任何一个元素不是None
,它将返回True
,但不能验证所有元素。你能帮我解决吗?谢谢!
None
的奇怪元素:assert None not in [a, b, c]
all([a, b, c])
的安全性要低得多,因为任何假值(例如零)都会使其返回 False
。 - no commentNone
检查要好得多,后者似乎相对较慢。 - rv.kvetch>>> assert all(i is not None for i in ['a', 'b', 'c'])
>>>
或者简单地说:
assert None not in ['a', 'b', 'c']
顺便提一句,我刚刚注意到@don'ttalkjustcode添加了上面的内容。
或者使用min
:
>>> assert min(a, key=lambda x: x is not None, default=False)
>>>
def assert_all_not_none(l):
for x in l:
if x is None:
return False
return True
from timeit import timeit
def all_not_none(l):
for b in l:
if b is None:
return False
return True
def with_min(l):
min(l, key=lambda x: x is not None, default=False)
def not_in(l):
return None not in l
def all1(l):
return all(i is not None for i in l)
def all2(l):
return all(False for i in l if i is None)
def all_truthy(l):
return all(l)
def any1(l):
return any(True for x in l if x is None)
l = ['a', 'b', 'c'] * 20_000
n = 1_000
# 0.63
print(timeit("all_not_none(l)", globals=globals(), number=n))
# 3.41
print(timeit("with_min(l)", globals=globals(), number=n))
# 1.66
print(timeit('all1(l)', globals=globals(), number=n))
# 0.63
print(timeit('all2(l)', globals=globals(), number=n))
# 0.63
print(timeit('any1(l)', globals=globals(), number=n))
# 0.26
print(timeit('all_truthy(l)', globals=globals(), number=n))
# 0.53
print(timeit('not_in(l)', globals=globals(), number=n))
令人惊讶的获胜者: all(list)
。 因此,如果您确定列表不包含空字符串或零等假值,则使用此方法没有问题。
all_not_none
之外,所有的都通常会在内联中使用(比如 if any(l):
)而不需要额外的函数调用,而 all_not_none
则需要调用(比如 if all_not_none(l)
)。但是总体来说还可以。还可以包括我在评论中提到的 all(False ...)
,由于与 此 相同的原因,应该更快。 - no commentany
应该改为 not any
。 - no comment
None
的标识检查。事实上,任何列表都不是 None,除了None
以外的任何对象都不是 None。 - juanpa.arrivillaga