如何检查列表中的所有项是否为None?
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
,而不能只是一个可迭代的对象。