1. ホーム
  2. パイソン

[解決済み】述語にマッチするシーケンスの最初の要素を探す

2022-04-05 23:16:04

質問

ある述語にマッチするリストの最初の要素を見つけるためのイディオム的な方法が欲しい。

現在のコードはかなり醜いです。

[x for x in seq if predicate(x)][0]

に変えようと思ったことがあります。

from itertools import dropwhile
dropwhile(lambda x: not predicate(x), seq).next()

でも、もっとエレガントなものがあるはず...。そして、もしそれが None の値は、一致するものがない場合に例外を発生させるのではありません。

みたいな関数を定義すればいいんだろうけど。

def get_first(predicate, seq):
    for i in seq:
        if predicate(i): return i
    return None

しかし、すでに同じものを提供しているビルトインがあるのなら、このようにユーティリティ関数でコードを埋め始めるのはかなり味気ないです(そして、人々はおそらくそれがすでにあることに気づかないので、時間とともに繰り返される傾向にあります)。

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

配列の最初の要素を見つけるには seq にマッチする predicate :

next(x for x in seq if predicate(x))

あるいは単純に

Python 2 :

next(itertools.ifilter(predicate, seq))

パイソン3 :

next(filter(predicate, seq))

これらは StopIteration 例外は、述語がどの要素にもマッチしない場合に発生します。


を返すには None そのような要素がない場合

next((x for x in seq if predicate(x)), None)

または

next(filter(predicate, seq), None)