Python - any () - Проверить, если элементы в списке - PullRequest
0 голосов
/ 13 ноября 2018

Я работаю над программой, где иногда приходится проверять, элементы списка больше или равны 0. Элементы списка всегда целые.

a = [0]

В некоторых случаях список содержит только одно целое число == 0: В этом случае мне нужно True в качестве возвращаемого значения этой проверки.

Я думал, что для этой цели могу использовать any () .

print(any(i for i in a if i >= 0))

Но any() возвращает False. Однако, если я расширю список, any() вернет True.

a = [0, 1]
print(any(i for i in a if i >= 0))
True

Я нашел обходной путь для этой проблемы, но я хотел бы знать, почему any() возвращает False, если список содержит один элемент.

for i in a:
  if i >= 0:
    print('True')
    break;

1 Ответ

0 голосов
/ 13 ноября 2018

Вы фильтруете список ввода, а затем запрашиваете any() проверить отфильтрованные значения. Для [0] отфильтрованная последовательность по-прежнему [0] (хотя и как сгенерированная последовательность, а не фактический список), и вы спрашиваете, является ли какое-либо из этих значений истинным. 0 - это ложное значение , поэтому any() возвращает ложь:

>>> a = [0]
>>> genexpr = (i for i in a if i >= 0)
>>> list(genexpr)
[0]
>>> bool(0)
False
>>> any(i for i in a if i >= 0)
False

Поставьте тест перед выражением генератора :

any(i >= 0 for i in a)

Это выражение не фильтрует, вместо этого оно генерирует последовательность логических значений, False, если тест не проходит, True, если он проходит. Для [0], который создает последовательность с одним значением True, поэтому any() возвращает True:

>>> genexpr = (i >= 0 for i in a)
>>> list(genexpr)
[True]
>>> any(i >= 0 for i in a)
True
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...