リストが非常に小さい場合、両者の間に大きな違いはありません。入力リストが大きくなる可能性がある場合は、さらに悪い問題があります。最初の要素で停止する可能性がある一方で、リスト全体を反復処理しています。これは for ループで実現できますが、内包表記のようなステートメントを使用する場合は、ジェネレーター式を使用します。
# like list comprehensions but with () instead of []
gen = (b for a, b in foo if a == 'b')
my_element = next(gen)
または単に:
my_element = next(b for a, b in foo if a == 'b')
ジェネレーター式について詳しく知りたい場合は、PEP 289を参照してください。
ジェネレーターとイテレーターを使用しても、複数の選択肢があることに注意してください。
# Python 3:
my_element = next(filter(lambda x: x[0] == 'b', foo))
# Python 2:
from itertools import ifilter
my_element = next(ifilter(lambda (x, y): x == 'b', foo))
私は個人的にこれが好きではなく、読みにくいのでお勧めしません。これは実際には最初のスニペットよりも遅いことがわかりましたが、より一般的filter()
には、ジェネレーター式の代わりに使用した方が、いくつかの特別なケースでは高速になる可能性があります。
いずれにせよ、コードのベンチマークが必要な場合は、モジュールを使用するtimeit
ことをお勧めします。