1. ホーム
  2. python

[解決済み] イテレートから条件に合致する最初の項目を取得する

2022-03-23 10:13:55

質問

ある条件に合致するリストの最初の項目を取得したい。結果として得られるメソッドがリスト全体を処理しないことが重要で、それは非常に大きくなる可能性があります。例えば、次のような関数が適切です。

def first(the_iterable, condition = lambda x: True):
    for i in the_iterable:
        if condition(i):
            return i

この関数は、次のような使い方ができる。

>>> first(range(10))
0
>>> first(range(10), lambda i: i > 3)
4

しかし、これを可能にする良い組み込み/ワンライナーが思いつきません。特に必要なければ、この関数をコピーする必要はないのですが。条件にマッチする最初の項目を取得する組み込みの方法はないでしょうか?

どのように解決するのですか?

Python 2.6+とPython 3。

もし、あなたが StopIteration が発生します。

next(x for x in the_iterable if x > 3)

もし、あなたが default_value (例 None を返します。

next((x for x in the_iterable if x > 3), default_value)

この場合、ジェネレータ式を囲む一対の括弧が必要であることに注意してください。

を断固として無視する回答が多いようですね。 next が組み込まれているため、何らかの不思議な理由でバージョン2.5以降に100%集中しているのだと思います。 する について言及しています。 next 少なくともquot;correct version"の問題は、この方法で記録されます;-)。

Python <= 2.5

.next() メソッドを呼び出すと、すぐに StopIteration イテレータがすぐに終了する場合、つまり、あなたの使用例では、イテレータブルの中に条件を満たす項目がない場合です。 もしあなたが気にしないのであれば(すなわち が必要です。 を使用すればよい。 .next() (genexpで最適、行は next Python 2.6以降で内蔵されています)。

もし、あなたが する また、あなたが提案した関数の実装も良いのですが、代わりに itertools , a for...: break ループ、またはgenexp、または try/except StopIteration を関数の本体として使用することを提案しました。 どの選択肢もあまり付加価値がないので、私なら最初に提案された極めてシンプルなバージョンにします。