Питонический способ проверки выполнения условия для любого элемента списка

112

У меня есть список на Python, и я хочу проверить, есть ли отрицательные элементы. В Specman есть has()метод для списков, который:

x: list of uint;
if (x.has(it < 0)) {
    // do something
};

Где itключевое слово Specman по очереди сопоставляется с каждым элементом списка.

Я считаю это довольно элегантным. Я просмотрел документацию Python и не нашел ничего похожего. Лучшее, что я мог придумать, было:

if (True in [t < 0 for t in x]):
    # do something

Я считаю это довольно неэлегантным. Есть ли лучший способ сделать это в Python?

Натан Феллман
источник

Ответы:

188

любой () :

if any(t < 0 for t in x):
    # do something

Также, если вы собираетесь использовать «True in ...», сделайте его выражением генератора, чтобы оно не занимало O (n) памяти:

if True in (t < 0 for t in x):
Кен
источник
1
Исправление: если вы собираетесь использовать True in ..., пересмотрите вариант и используйте anyвместо него.
Аран-Фей
29

Используйте any().

if any(t < 0 for t in x):
    # do something
Дэниел Прайден
источник
10

Python имеет встроенную функцию any () именно для этой цели.

Рори
источник
Только 2.5+. В противном случае вам нужно создать функцию, возможно, используя ifilter и исключения, или bool (set ((x for x if cond))) или тому подобное.
Грегг Линд
1
Вместо сложной штуки с фильтром ifilter просто выполните: def any (it): for el in it: if el: return True; return False
Рори