2010-08-27 87 views
13
l=[None,None] 

是否有函數檢查列表l是否只包含None或不包含?如何檢查列表中是否只包含無python

+0

什麼它應該返回空列表[[]'? – Constantin 2010-08-27 12:07:45

+1

[如何檢查列表中的所有項目是否都是?]的可能重複(http://stackoverflow.com/questions/6518394/how-to-check-if-all-items-in-the-list-are - 無) – 2011-06-30 05:17:50

+0

可能的重複[最簡潔的方式來檢查列表是否爲空或\ [無\]?](http://stackoverflow.com/questions/1270920/most-concise-way-to-check-whether -a-list-is-empty-or-none) – ThiefMaster 2012-06-09 00:56:17

回答

24

如果你的意思是,檢查列表l只包含無,

if all(x is None for x in l): 
    ... 
+0

「...僅包含無」OR爲空。 – Constantin 2010-08-27 12:16:32

+0

@system:爲什麼不呢? – kennytm 2010-08-27 12:19:55

+0

@systempuntoout,這實際上是一個生成器表達式。 – Constantin 2010-08-27 12:20:36

8

嘗試any() - 它檢查列表中是否有單個元素在布爾上下文中被認爲是TrueNone在布爾上下文中計算爲False,因此any(l)變爲False

請注意,要檢查列表(而不是其內容)是否真的是None,則必須使用if l is None。和if not l檢查它是否是無(或其他任何被認爲是False)或空。

+0

>>> any([None,None,0]) 將給出錯誤 – 2011-06-29 10:31:51

+0

我怎麼沒有聽說過任何()?這個問題呢?驚人。 – otocan 2017-04-06 09:03:37

19
L == [None] * len(L) 

比使用更快的所有()當L 所有無

$ python -m timeit -s'L=[None]*1000' 'all(x is None for x in L)' 
1000 loops, best of 3: 276 usec per loop 
$ python -m timeit -s'L=[None]*1000' 'L==[None]*len(L)' 
10000 loops, best of 3: 34.2 usec per loop 
0

如果你想檢查列表中的成員是否爲None,那麼你可以遍歷這些項目並檢查它們是否爲無

如果你想檢查列表本身是沒有,你可以使用類型(varlist中),它會返回None

你可以做

如果(LST ==無): ...打印「是」

有效。

2

我個人更喜歡做一個set,然後驗證它是否等於一組具有一個元素None

set(l) == {None} 

assert set([None, None, None]) == {None} 
assert set([None, 2, None]) != {None} 

不是最快的,但仍比all(...)實現更快:

$ python -m timeit -s'L=[None]*1000' 'all(x is None for x in L)' 
10000 loops, best of 3: 59 usec per loop 
$ python -m timeit -s'L=[None]*1000' 'set(L)=={None}' 
100000 loops, best of 3: 17.7 usec per loop 
$ python -m timeit -s'L=[None]*1000' 'L==[None]*len(L)' 
100000 loops, best of 3: 7.17 usec per loop 
+0

感謝@JohnLaRooy的基準代碼 – 2016-07-28 18:55:17

相關問題