85

Python標準ライブラリは、次のany()関数を定義します

iterableのいずれかの要素がtrueの場合、Trueを返します。iterableが空の場合は、Falseを返します。

要素がに評価されるかどうかのみをチェックしTrueます。私がそれを可能にしたいので、要素が次のように法案に適合するかどうかを伝えるためにコールバックを指定します:

any([1, 2, 'joe'], lambda e: isinstance(e, int) and e > 0)
4

8 に答える 8

138

どうですか:

>>> 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
于 2010-01-06T11:43:32.287 に答える
19

条件が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つの関数は、適切に使用すると非常に便利です。

于 2010-01-06T11:54:44.750 に答える
12

「ジェネレータ式」を使用する必要があります。つまり、イテレータを使用し、フィルタと式を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)
于 2010-01-06T11:45:16.010 に答える
8

アントワーヌ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
于 2014-03-14T02:20:43.613 に答える
6

他の人は良い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)
于 2013-11-08T20:43:45.160 に答える
5

anyとの組み合わせを使用できmapます。ラムダ表記を次のように保持したい場合は、次のようにします。

any(map(lambda e: isinstance(e, int) and e > 0, [1, 2, 'joe']))

ただし、リスト全体が2回作成されることはないため、ジェネレータ式を使用することをお勧めします。

于 2015-02-09T16:02:51.393 に答える
4

フィルタは機能し、さらに一致する要素を返します

>>> filter(lambda e: isinstance(e, int) and e > 0, [1,2,'joe'])
[1, 2]
于 2010-01-06T16:48:38.307 に答える
3

any()でラムダを本当にインライン化したい場合は、次のようにすることができます。

>>> any((lambda: isinstance(e, int))() for e in [1,2,'joe'])
True
>>> any((lambda: isinstance(e, int))() for e in ['joe'])
False

名前のないラムダをラップし、パスごとにラムダを追加して呼び出されるようにする必要があります。()

ここでの利点は、最初のintに到達したときに、評価の短絡を利用できることです。

于 2017-08-01T22:22:11.103 に答える