Python функция all () не показывает истину, когда список идентичен - PullRequest
0 голосов
/ 08 мая 2020

У меня есть список чисел с плавающей запятой, и я хочу проверить, все ли они равны нулю. Поэтому я пытаюсь реализовать это с помощью функции all ().

Я пробовал использовать один метод, который, по моей теории, должен работать, но не работает:

test = [0, 0.4, 0, 0, 0.4, 0.4, 0.4, 0.21052631578947367, 0.4, 0.21052631578947367, 0.21052631578947367, 0.4, 0.21052631578947367]
all(test) == 0

>>> True

В приведенном выше случае вывод должен быть False, однако я не уверен, почему это True.

Метод, представленный ниже, является тем, который работает.

test = [0, 0.4, 0, 0, 0.4, 0.4, 0.4, 0.21052631578947367, 0.4, 0.21052631578947367, 0.21052631578947367, 0.4, 0.21052631578947367]
all(x==0 for x in test)

>>> False

Кто-нибудь может объяснить это короткое замыкание во всем поведении?

Ответы [ 3 ]

3 голосов
/ 08 мая 2020

В приведенном выше случае (all(test)) вывод должен быть False, однако я не уверен, почему это True.

Потому что all(test) оценивается как False, которое проверяет как 0.

all() само возвращает True, если все элементы ввода правдивы. В вашем случае 0 - нет, поэтому "короткое замыкание" произойдет, когда all() увидит 0-й элемент и поймет, что дальше в итерируемом элементе нет необходимости.

Еще один способ to express лог c, который вы ищете, будет:

>>> not any(test)
False
>>> not any((0, 0, 0, 0))
True

Но имейте в виду, что это будет обрабатывать любые ложные значения (например, None) так же, как и ноль . Если вы смотрите конкретно на int zero, не помешает быть явным.

>>> not any((None, False, 0, [], 0))
True
0 голосов
/ 08 мая 2020

Первая версия возвращает True, если все элементы True. 0 неверно.

Вторая версия неверна, как вы думаете.

Результат

print(x==0 for x in test)

Будет

<generator object <genexpr> at 0x7fce4f84bc60> 

Следовательно, это это не то, что вам нужно.

Вы должны использовать any () .

elements = test = [0, 0.4, 0, 0, 0.4, 0.4, 0.4, 0.21052631578947367, 0.4, 0.21052631578947367, 0.21052631578947367, 0.4, 0.21052631578947367]

if not any(elements):
    print('All elements are false.')
0 голосов
/ 08 мая 2020

Функции all и any проверяют, содержит ли массив логических значений все True или все False соответственно. В Python (и в большинстве языков) любая непустая строка оценивается как True, как и любое число, отличное от 0.
В вашем первом примере 0 в вашем списке эквивалентно False, поэтому все (тест) равно до 0. Во втором примере вы используете синтаксис понимание списка для генерации логического массива, который имеет значение True, если значение равно 0, и False в противном случае, поэтому all приводит к False ( не все значения истинны, равно 0)

...