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

istnieje funkcja, która sprawdza, czy lista l zawiera jedynie None czy nie?jak sprawdzić, czy lista zawiera tylko None w python

+0

Co czy powinien powrócić do pustej listy '[]'? – Constantin

+1

możliwy duplikat [Jak sprawdzić, czy wszystkie pozycje na liście są Brak?] (Http://stackoverflow.com/questions/6518394/how-to-check-if-all-items-in-the-list-are- -none) –

+0

możliwy duplikat [najbardziej zwięzły sposób sprawdzenia, czy lista jest pusta lub \ [Brak \]?] (http://stackoverflow.com/questions/1270920/most-concise-way-to-check-whether -a-list-is-empty-or-none) – ThiefMaster

Odpowiedz

24

Jeśli masz na myśli, aby sprawdzić, czy lista l zawiera tylko Zadne

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

"... zawiera tylko brak" LUB jest puste. – Constantin

+0

@system: Dlaczego nie? – kennytm

+0

@systempuntoout, w rzeczywistości jest to wyrażenie generujące. – Constantin

8

Wypróbuj any() - sprawdza, czy na liście znajduje się pojedynczy element, który w kontekście boolowskim jest uważany za True. None ocenia się na False w kontekście logicznym, więc any(l) staje się False.

Należy pamiętać, że aby sprawdzić, czy lista (a nie jej zawartość) jest naprawdę None, należy użyć if l is None. I if not l, aby sprawdzić, czy jest to Brak (lub cokolwiek innego, co jest uważane za False) lub pusty.

+0

>>> dowolne ([Brak, Żadne, 0]) da Fałszywą –

+0

Jak doszedłem tak daleko, nie słysząc o 'any()'? Niesamowity. – otocan

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

jest znacznie szybsze niż przy użyciu wszystkich(), gdy L jest wszystkie żadne

$ 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

Jeśli chcesz sprawdzić, czy członkowie listy mają wartość None, możesz zapętlić pozycje i sprawdzić, czy są one nieobecne:

Jeśli chcesz sprawdzić, czy sama lista jest None, można użyć typu (varlist) i zwróci None

można zrobić

if (LST == None): ... print "tak"

działa.

2

ja osobiście wolę dokonywania set a następnie sprawdzenie, czy jest on równy zestawie z jednym elementem None:

set(l) == {None} 

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

nie najszybszy, ale jeszcze szybciej niż realizacja 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

dzięki @JohnLaRooy za kod testowy –

Powiązane problemy