2013-07-24 27 views
13
>>> 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()只有一個參數:可迭代。有沒有更好的辦法?如何用自定義謂詞實現python的any()?

回答

23

使用generator expression作爲一個參數:

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 
6

使用發電機表達的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)