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

есть функция, которая проверяет, содержит ли список l только None или нет?Как проверить, содержит ли список только None в python

+0

Что если он вернется для пустого списка '[]'? – Constantin

+1

Возможный дубликат [Как проверить, нет ли всех элементов в списке?] (Http://stackoverflow.com/questions/6518394/how-to-check-if-all-items-in-the-list-are -нон) –

+0

Возможный дубликат [Самый краткий способ проверить, пуст ли список или \ [Нет \]?] (http://stackoverflow.com/questions/1270920/most-concise-way-to-check-whether -a-list-is-empty-or-none) – ThiefMaster

ответ

24

Если вы имеете в виду, чтобы проверить, если список l содержит только None,

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

"... содержит только None" ИЛИ пусто. – Constantin

+0

@system: Почему бы и нет? – kennytm

+0

@systempuntoout, это фактически выражение генератора. – Constantin

8

Попробуйте any() - он проверяет, существует ли в списке один элемент, который считается True в булевом контексте. None оценивает по False в булевом контексте, поэтому any(l) становится False.

Обратите внимание, что для проверки действительно ли списка (а не его содержимого) None, if l is None. И if not l, чтобы проверить, является ли он ни None (или что-либо еще, что считается False), либо пустым.

+0

>>> any ([None, None, 0]) даст False –

+0

Как я получил это далеко, не услышав 'any()'? Удивительно. – otocan

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, то вы можете перебрать элементы и проверить, являются ли они None

Если вы хотите проверить, если список сам по себе не является None, вы можете использовать тип (список переменных), и он будет возвращать None

вы можете сделать

если (LST == None): ... печать «да»

работ.

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 для эталонного кода –