Python標準ライブラリは、次のany()
関数を定義します
iterableのいずれかの要素がtrueの場合、Trueを返します。iterableが空の場合は、Falseを返します。
要素がに評価されるかどうかのみをチェックしTrue
ます。私がそれを可能にしたいので、要素が次のように法案に適合するかどうかを伝えるためにコールバックを指定します:
any([1, 2, 'joe'], lambda e: isinstance(e, int) and e > 0)
Python標準ライブラリは、次のany()
関数を定義します
iterableのいずれかの要素がtrueの場合、Trueを返します。iterableが空の場合は、Falseを返します。
要素がに評価されるかどうかのみをチェックしTrue
ます。私がそれを可能にしたいので、要素が次のように法案に適合するかどうかを伝えるためにコールバックを指定します:
any([1, 2, 'joe'], lambda e: isinstance(e, int) and e > 0)
どうですか:
>>> any(isinstance(e, int) and e > 0 for e in [1,2,'joe'])
True
all()
もちろん、次の場合にも機能します。
>>> all(isinstance(e, int) and e > 0 for e in [1,2,'joe'])
False
条件がTrueの場合、関数はTrueを返します。
>>> any(isinstance(e, int) and e > 0 for e in [0 ,0, 1])
True # Returns True because 1 is greater than 0.
>>> any(isinstance(e, int) and e > 0 for e in [0 ,0, 0])
False # Returns False because not a single condition is True.
実際、関数の概念はLispからもたらされたものであるか、関数プログラミングのアプローチから言うことができます。それとは正反対の別の機能がありますすべてです
>>> all(isinstance(e, int) and e > 0 for e in [1, 33, 22])
True # Returns True when all the condition satisfies.
>>> all(isinstance(e, int) and e > 0 for e in [1, 0, 1])
False # Returns False when a single condition fails.
これらの2つの関数は、適切に使用すると非常に便利です。
「ジェネレータ式」を使用する必要があります。つまり、イテレータを使用し、フィルタと式を1行で適用できる言語構造を使用する必要があります。
たとえば(i ** 2 for i in xrange(10))
、最初の10個の自然数(0から9)の2乗のジェネレーターです。
また、「if」句で「for」句のitensをフィルタリングできるため、例では次のように使用できます。
any (e for e in [1, 2, 'joe'] if isinstance(e, int) and e > 0)
アントワーヌPの答えにわずかな改善
>>> any(type(e) is int for e in [1,2,'joe'])
True
にとってall()
>>> all(type(e) is int for e in [1,2,'joe'])
False
他の人は良いPythonicの答えを出しましたが(ほとんどの場合、受け入れられた答えを使用します)、本当に必要な場合は、独自のユーティリティ関数を自分で作成するのがいかに簡単かを指摘したいと思います。
def any_lambda(iterable, function):
return any(function(i) for i in iterable)
In [1]: any_lambda([1, 2, 'joe'], lambda e: isinstance(e, int) and e > 0
Out[1]: True
In [2]: any_lambda([-1, '2', 'joe'], lambda e: isinstance(e, int) and e > 0)
Out[2]: False
ただし、少なくとも最初に関数パラメーターを使用して定義すると思います。これは、map()やfilter()などの既存の組み込み関数とより厳密に一致するためです。
def any_lambda(function, iterable):
return any(function(i) for i in iterable)
any
との組み合わせを使用できmap
ます。ラムダ表記を次のように保持したい場合は、次のようにします。
any(map(lambda e: isinstance(e, int) and e > 0, [1, 2, 'joe']))
ただし、リスト全体が2回作成されることはないため、ジェネレータ式を使用することをお勧めします。
フィルタは機能し、さらに一致する要素を返します
>>> filter(lambda e: isinstance(e, int) and e > 0, [1,2,'joe'])
[1, 2]
any()でラムダを本当にインライン化したい場合は、次のようにすることができます。
>>> any((lambda: isinstance(e, int))() for e in [1,2,'joe'])
True
>>> any((lambda: isinstance(e, int))() for e in ['joe'])
False
名前のないラムダをラップし、パスごとにラムダを追加して呼び出されるようにする必要があります。()
ここでの利点は、最初のintに到達したときに、評価の短絡を利用できることです。