Каков наилучший способ проверить, имеет ли кортеж какие-либо пустые значения /None в Python?
Каков наилучший/самый эффективный способ проверить, все ли значения кортежа? Нужно ли мне перебирать все элементы кортежа и проверять или есть еще лучший способ?
Например:
t1 = (1, 2, 'abc')
t2 = ('', 2, 3)
t3 = (0.0, 3, 5)
t4 = (4, 3, None)
Проверяя эти кортежи, каждый кортеж, кроме t1
, должен возвращать True, то есть есть так называемое пустое значение.
P.S. есть этот вопрос: Проверить, если кортеж содержит только значения None с Python, но это только значения None
Ответы
Ответ 1
Это очень просто:
not all(t1)
возвращает False
, только если все значения в t1
не являются пустыми/ненулевыми, а не None
. all
коротких замыканий, поэтому он должен проверять элементы до первого пустого, что делает его очень быстрым.
Ответ 2
Был предоставлен ответ, используя все:
not all(t1)
Однако в случае, таком как t3, это вернет True, потому что одно из значений: 0:
t3 = (0.0, 3, 5)
Встроенное ключевое слово 'all' проверяет, являются ли все значения заданного итеративного значения значениями, которые вычисляются отрицательным логическим значением (False). 0, 0.0, '' и None - все равно False.
Если вы хотите протестировать только "Нет" (как следует из названия вопроса), это работает:
any(map(lambda x: x is None, t3))
Возвращает True, если какой-либо из элементов t3 имеет значение None или False, если ни один из них не является.
Ответ 3
В вашем конкретном случае вы можете использовать функцию 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")