カスタム述語を使用して Python の any() を実現するにはどうすればよいでしょうか? 質問する

カスタム述語を使用して 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()引数は 1 つだけ、つまり反復可能オブジェクトのみを取ります。もっと良い方法はありますか?

ベストアンサー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

おすすめ記事