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
?
答案 0 :(得分:128)
all(v is None for v in l)
如果True
的所有元素都是l
,将返回None
请注意,l.count(None) == len(l)
速度要快得多,但要求l
为实际list
,而不仅仅是可迭代的。
答案 1 :(得分:34)
not any(my_list)
如果True
的所有项都是假的,则返回my_list
。
修改:由于匹配对象始终是trucy且None
是假的,因此对于手头的情况,这将给出与all(x is None for x in my_list)
相同的结果。如gnibbler's answer所示,使用any()
是目前为止更快的替代方案。
答案 2 :(得分:11)
由于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
答案 3 :(得分:5)
或者有点奇怪但是:
a = [None, None, None]
set(a) == set([None])
OR:
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
答案 4 :(得分:0)
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
答案 5 :(得分:0)
我设法用map
提出了一种尚未给出的方法
def all_none(l):
return not any(map(None.__ne__, l))
all_none([None, None, None]) # -> True
all_none([None, None, 8]) # -> False
使用None.__ne__
有点奇怪,乍一看。当给定的值不是None时,此方法将返回NotImplementedType
对象。
您希望NotImplemented
将成为False
的替身,但这也是事实!这意味着在集合中使用None.__eq__
将为所有内容产生真实的值。
list(map(None.__eq__, [None, None, 8]))
# -> [True, True, NotImplemented]
all(list(map(None.__eq__, [None, None, 8])))
# -> True
来自Python Docs:
默认情况下,除非对象的类定义,否则将其视为true 返回False的 bool ()方法或 len ()方法 返回零
相反,None.__ne__
对于任何False
元素返回None
,并且返回
NotImplementedType
对象是否包含其他内容:
list(map(None.__ne__, [None, None, 8]))
# -> [False, False, NotImplemented]
使用此方法,您可以检查any
元素是否不是None
并返回True
。我想将其视为2种单独的方法,以帮助进行精神否定体操。
def contains_truthy(l):
return any(map(None.__ne__, l))
def all_none(l):
return not contains_truthy(l)
我尚未对此进行任何基准测试,但是正如该线程中的其他人所提到的,not any
将产生快速的结果。