69

私はジェネレーターを使用して、次の簡単な例のようなリストで検索を実行しています。

>>> a = [1,2,3,4]
>>> (i for i, v in enumerate(a) if v == 4).next()
3

(例を少しフレームに入れるために、上記のリストに比べて非常に長いリストを使用していますint。エントリはより少し複雑です。このようにすると、リスト全体が毎回トラバースされなくなります。それらを検索)

代わりにこれをに変更すると、にエントリが見つからないため、i == 666が返されます。StopIteration666a

代わりにどうすれば返品できNoneますか?もちろん、それをtry ... except句で囲むこともできますが、それを行うためのよりPython的な方法はありますか?

4

2 に答える 2

148

Python 2.6以降を使用している場合は、メソッド( 3.xで置き換えられた)nextではなく、組み込み関数を使用する必要があります。ビルトインは、イテレータが使い果たされた場合に返すために、オプションのデフォルト引数を取ります。next__next__nextStopIteration

next((i for i, v in enumerate(a) if i == 666), None)
于 2011-08-18T04:00:11.523 に答える
7

ジェネレータを(None、)でチェーンできます:

from itertools import chain
a = [1,2,3,4]
print chain((i for i, v in enumerate(a) if v == 6), (None,)).next()

しかし、a.index(2)は完全なリストをトラバースしないと思います。2が見つかると、検索は終了します。これをテストできます:

>>> timeit.timeit("a.index(0)", "a=range(10)")
0.19335955439601094
>>> timeit.timeit("a.index(99)", "a=range(100)")
2.1938486138533335
于 2011-08-18T03:37:49.953 に答える