簡體   English   中英

如何檢查列表中的所有項目是否都沒有?

[英]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的方法

tl;博士

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元素不是返回TrueNone 如果這有助於心理否定體操,我喜歡將其視為兩種不同的方法。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM