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?
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?
Answers:
all(v is None for v in l)
将返回True如果所有的元素l都None
请注意,l.count(None) == len(l)这要快得多,但是要求它l是实际的list而不仅仅是可迭代的。
None出现时停止吗?对我来说毫无意义。
all(v is None for v in l)如果您0在适当位置安装了None
not any(my_list)
返回True如果所有项目my_list都falsy。
编辑:由于匹配对象始终是虚伪的并且None是虚假的,所以这将产生与all(x is None for x in my_list)手头情况相同的结果。如gnibbler的答案所示,any()到目前为止,使用是更快的选择。
True,None评估为False。此外,只有0被认为是虚假的,而不是“数值小于1”。
re.match()是None或匹配对象,因此该解决方案不会因失败而无所谓0。我添加了一些解释以使其更清楚。
由于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_empty(my_list)是return not any(my_list)。至少,您应该省略前两行。
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
lambda在这里使用它而不是简单的def。
我设法提出一种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__乍看之下,使用有点奇怪。NotImplementedType当给定的值不是None时,此方法将返回一个对象。
您希望这NotImplemented将是的替代False,但这也是事实!这意味着None.__eq__在集合中使用将为所有内容产生真正的价值。
list(map(None.__eq__, [None, None, 8]))
# -> [True, True, NotImplemented]
all(list(map(None.__eq__, [None, None, 8])))
# -> True
从Python文档:
默认情况下,除非对象的类定义了返回False的bool()方法或返回零的len()方法,否则将其视为true。
相反,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将产生快速的结果。