Подтвердить что ты не робот

Как достичь python any() с помощью пользовательского предиката?

>>> l = list(range(10))
>>> l
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> if filter(lambda x: x > 10, l):
...     print "foo"
... else:                     # the list will be empty, so bar will be printed
...     print "bar"
... 
bar

Я хотел бы использовать any() вместо этого, но any() принимает только один аргумент: iterable. Есть ли лучший способ?

4b9b3361

Ответ 1

Используйте выражение генератора как один из аргументов:

any(x > 10 for x in l)

Здесь предикат находится в выражении выражения генератора, но вы можете использовать любое выражение там, включая использование функций.

Демо:

>>> l = range(10)
>>> any(x > 10 for x in l)
False
>>> l = range(20)
>>> any(x > 10 for x in l)
True

Выражение генератора будет повторяться до тех пор, пока any() не найдет результат True, а дальше:

>>> from itertools import count
>>> endless_counter = count()
>>> any(x > 10 for x in endless_counter)
True
>>> # endless_counter last yielded 11, the first value over 10:
...
>>> next(endless_counter)
12

Ответ 2

Используйте выражение генератора внутри any():

pred = lambda x: x > 10
if any(pred(i) for i in l):
    print "foo"
else:
    print "bar"

Это предполагает, что у вас уже есть предикатная функция, которую вы хотите использовать, конечно, если это что-то простое, вы можете просто использовать логическое выражение напрямую: any(i > 10 for i in l).