Python断言list中的所有元素不是none



我想知道我们是否可以断言列表中的所有元素不是None,因此当a = None会引发错误。

示例列表为[a, b, c]

我已经尝试了assert [a, b, c] is not None,如果任何一个元素不是None但不验证所有,它将返回True。你能帮我弄明白吗?谢谢! !

除非你有一个奇怪的元素声称它等于None:

assert None not in [a, b, c]

你指的是all:

>>> assert all(i is not None for i in ['a', 'b', 'c'])
>>>

或者直接:

assert None not in ['a', 'b', 'c']

p。S刚刚注意到@don'ttalkjustcode添加了以上内容。

或与min:

>>> assert min(a, key=lambda x: x is not None, default=False)
>>>

not inall之间。请注意,对于这种特殊情况,使用all的合理版本最终会执行缓慢-但至少优于min

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).因此,如果您确定list不会包含假值,如空字符串或零,那么这样做没有错。

相关内容

  • 没有找到相关文章

最新更新