如何检查列表中的所有项是否为None?

131 投票
7 回答
139276 浏览
提问于 2025-04-16 20:30
In [27]: map( lambda f,p: f.match(p), list(patterns.itervalues()), vatids )
Out[27]: [None, <_sre.SRE_Match object at 0xb73bfdb0>, None]

这个列表里的内容可能全都是 None,或者里面有一个是 re.Match 实例。请问我可以用什么简单的一行代码来检查这个返回的列表,看看里面的内容是不是全都是 None 呢?

7 个回答

21

因为匹配对象永远不会被认为是假的,所以直接用 not any(L) 这样写是可以的,而且速度更快。

$ python -m timeit -s"L=[None,None,None]" "all( v is None for v in L )"
100000 loops, best of 3: 1.52 usec per loop
$ python -m timeit -s"L=[None,None,None]" "not any(L)"
1000000 loops, best of 3: 0.281 usec per loop

$ python -m timeit -s"L=[None,1,None]" "all( v is None for v in L )"
100000 loops, best of 3: 1.81 usec per loop
$ python -m timeit -s"L=[None,1,None]" "not any(L)"
1000000 loops, best of 3: 0.272 usec per loop
85

针对问题中的具体情况,你可以使用

not any(my_list)

这个方法会返回 True,如果 my_list 里的所有项目都是“假”的。因为你列表里的对象只有匹配对象和 None,而匹配对象总是“真”的,所以这个方法的结果和 all(x is None for x in my_list) 是一样的。正如 gnibbler 的回答 所示,使用 not any(my_list) 会快得多。

257
all(v is None for v in l)

如果列表 l 中的所有元素都是 None,那么这个表达式会返回 True

需要注意的是,使用 l.count(None) == len(l) 这种写法会更快,但前提是 l 必须是一个真正的 list,而不能只是一个可迭代的对象。

撰写回答