Как достичь 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. Есть ли лучший способ?
Ответы
Ответ 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)
.