1

私はこのようなことをしたいと思います:

x = f(a[0]) or f(a[1]) or f(a[2]) or f(a[3]) or …

指定された listaと指定された function を使用しますf。組み込み関数とは異なり、any真と見なされるリストの最初の値を取得する必要があります。だけでなく、0 or "foo" or 3.2を取得する必要があるからです。"foo"True

もちろん、次のような小さな関数を書くこともできます

def returnFirst(f, a):
  for i in a:
    v = f(i)
    if v:
      return v
  return False

x = returnFirst(f, a)

しかし、これはおそらく最も良い解決策ではありません。理由は、この SO の質問にも記載されています。この他のスレッドについて言及しているように、もちろん、そこで与えられた解決策に基づいたコードを使用することもできます。

x = next((f(x) for x in a if f(x)), False)

しかし、その後の二重呼び出しを回避する簡単な方法はわかりませんf

私が見逃している、または知らない簡単な解決策はありますか? のようなもの

OR((f(x) for x in a))

多分?

これに関する他の質問を見つけようとしましたがor、SO でのようなキーワードの検索は少し問題があるため、適切なものが見つからなかったのかもしれません。

4

2 に答える 2

2

これはうまくいくはずです:

next((x for y in a for x in (f(y),) if x),False)
于 2013-08-13T12:24:04.507 に答える
0

私は今これを使用しています:

x = next((v for v in (f(x) for x in a) if v), False)

の呼び出しを倍増させたり、ハッキーなローカルを導入したりすることなく、実用的なイディオムfですが、それでもあまり読みやすくはありません (特に、xfa、およびvが 1 文字より長い場合)。

より良い解決策を教えていただければ幸いです。

于 2013-08-13T13:50:03.087 に答える