[英]How to check if all items in the list are 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
?
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
。
編輯:由於匹配對象總是 trucy 並且None
是虛假的,因此對於手頭的情況,這將給出與all(x is None for x in my_list)
相同的結果。 正如gnibbler 的回答所示,使用any()
是迄今為止更快的選擇。
由於 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
我設法想出一種使用尚未給出的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
object。
您可能希望NotImplemented
成為False
的替代品,但它也是真實的! 這意味着在集合中使用None.__eq__
將為所有內容產生真實的值。
list(map(None.__eq__, [None, None, 8]))
# -> [True, True, NotImplemented]
all(list(map(None.__eq__, [None, None, 8])))
# -> True
來自Python 文檔:
默認情況下,object 被認為是 true,除非它的 class 定義了返回 False 的bool () 方法或返回零的len () 方法
相反, None.__ne__
為任何None
元素返回False
,為任何其他元素返回NotImplementedType
object :
list(map(None.__ne__, [None, None, 8]))
# -> [False, False, NotImplemented]
使用它,您可以檢查是否any
元素不是返回True
的None
。 如果這有助於心理否定體操,我喜歡將其視為兩種不同的方法。
def contains_truthy(l):
return any(map(None.__ne__, l))
def all_none(l):
return not contains_truthy(l)
我沒有對此進行任何基准測試,但正如該線程中的其他人所提到的, not any
會產生快速的結果。
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.