如何使用自定义谓词实现Python中的any()函数?

29
>>> 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()只接受一个参数:可迭代对象。有更好的方法吗?

2个回答

52
使用生成器表达式作为一个参数:

使用生成器表达式作为那个参数:

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

7
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)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接