web-dev-qa-db-ja.com

Pythonコールバック付き)のany()関数

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

Iterableのいずれかの要素がtrueの場合、trueを返します。イテラブルが空の場合、Falseを返します。

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

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

どうですか:

_>>> 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
_
102
Antoine P.

any関数は、いずれかの条件が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.

実際、any関数の概念はLISPからもたらされたものであるか、関数プログラミングアプローチから言えます。それと正反対の別の関数がありますall

>>> 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つの機能は、適切に使用すると本当にクールです。

19
aatifh

「ジェネレータ式」を使用する必要があります。つまり、イテレータを使用して、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)
8
jsbueno

アントワーヌ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
_
6
SohamC

他の人はPythonの良い答えを出しましたが(ほとんどの場合、受け入れられた答えを使用します)、本当にあなたがそれを好むなら、あなた自身のユーティリティ関数を自分でこれを行うのがどれほど簡単かを指摘したかっただけです:

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

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

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

ラムダ表記をそのままにしておきたい場合は、anymapの組み合わせを使用できます。

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

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

2
volent

(実際に any()でラムダをインライン化したい場合、これを行うことができます:

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

名前のないラムダをラップし、()を追加することで各パスで呼び出されることを確認する必要があります。

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

0
Doug Coburn