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()は1つの引数、すなわちiterableを取ります。より良い方法がありますか?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 

True結果を見つけ、そして無さらにany()までジェネレータ発現がにわたって反復される。

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

関連する問題