24
>>> 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()只接受一个参数:可迭代。有没有更好的办法?

4

2 回答 2

39

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

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
于 2013-07-24T16:20:21.487 回答
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).

于 2013-07-24T16:20:57.550 回答