Python 断言列表中的所有元素都不是 none

Python assert all elements in list is not none

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

样本列表是[a, b, c]

我试过assert [a, b, c] is not None,如果任何一个元素不是None但没有验证全部,它会returnTrue。你能帮忙算一下吗?谢谢!!

你的意思是 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)
>>>

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

assert None not in [a, b, c]

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