2015-07-01 1 views
12

Каков наилучший/самый эффективный способ проверить, все ли значения кортежа? Нужно ли мне перебирать все элементы кортежа и проверять или есть еще лучший способ?Каков наилучший способ проверить, имеет ли кортеж какие-либо пустые значения/None в Python?

Например:

t1 = (1, 2, 'abc') 
t2 = ('', 2, 3) 
t3 = (0.0, 3, 5) 
t4 = (4, 3, None) 

Проверка этих кортежей, каждый кортеж кроме t1, должен возвращать Правда, смысл есть так называемый пустое значение.

P.S. есть этот вопрос: Test if tuple contains only None values with Python, но это только Нет значение

+4

Как 'не все (tn)'? – jonrsharpe

+0

О, это будет делать :) – Andrius

ответ

21

Это очень легко:

not all(t1) 

возвращает False только тогда, когда все значения в t1 непустые/отличны от нуля и не None. all, поэтому он должен проверять элементы до первого пустого, что делает его очень быстрым.

+0

Также работает для 'namedtuple' (так как это подкласс, конечно) =) – jpmc26

+0

@TimPietzcker: извините, вы правы, я читал слишком быстро. – lodebari

+0

@TimPietzcke Я думаю, что он также проверяет значение False (Boolean), если одно из значений в кортеже False все (t1) вернется False – sau

0

Для вашего конкретного случая вы можете использовать функцию all(), она проверяет все значения списка как истинные или ложные, обратите внимание, что в python None пустая строка и 0 считаются ложными.

Так -

>>> t1 = (1, 2, 'abc') 
>>> t2 = ('', 2, 3) 
>>> t3 = (0.0, 3, 5) 
>>> t4 = (4, 3, None) 
>>> all(t1) 
True 
>>> all(t2) 
False 
>>> all(t3) 
False 
>>> all(t4) 
False 
>>> if '': 
...  print("Hello") 
... 
>>> if 0: 
...  print("Hello") 
2

Ответ, используя все было предусмотрено:

not all(t1) 

Однако в таком случае, как t3, это возвращает истину, потому что один из значений 0:

t3 = (0.0, 3, 5) 

Встроенное ключевое слово «все» проверяет, являются ли все значения заданного итерабельны значениями, которые оцениваются с отрицательным булевым (F Alse). 0, 0.0, '' и None - все равно False.

Если вы хотите проверить на None (как заголовок вопроса предполагает), это работает:

any(map(lambda x: x is None, t3)) 

Это возвращает Истина, если какой-либо из элементов t3 не является None, или неверно, если ни один из они.

Смежные вопросы