如何检查列表中的所有项目是否为无?
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实例。 我可以在退货清单上做一次class轮支票,告诉我内容都是None
?
all(v is None for v in l)
如果l
所有元素都是None
则返回True
请注意, l.count(None) == len(l)
要快得多,但要求l
是一个实际的list
,而不仅仅是一个迭代。
not any(my_list)
如果my_list
所有项都是虚假的,则返回True
。
编辑 :由于匹配对象总是真实可信,而且None
错误,所以对于手头的情况,这将得到与all(x is None for x in my_list)
相同的结果。 正如gnibbler的回答所certificate的 ,使用any()
都是更快的select。
由于Match对象永远不会评估为false,所以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
或者有点奇怪,但是:
a = [None, None, None] set(a) == set([None])
要么:
if [x for x in a if x]: # non empty list #do something
编辑:
def is_empty(lVals): if not lVals: return True for x in lVals: if x: return False return True
is_all_none = lambda L: not len(filter(lambda e: not e is None, L)) is_all_none([None,None,'x']) False is_all_none([None,None,None]) True