リスト["foo", "bar", "baz"]
とリスト内の項目が与えられた場合"bar"
、そのインデックスを取得するにはどうすればよいでしょうか1
?
ベストアンサー1
>>> ["foo", "bar", "baz"].index("bar")
1
見るドキュメント.index()
リストの組み込みメソッドの場合:
list.index(x[, start[, end]])
リスト内で値がxに等しい最初の項目の0から始まるインデックスを返します。
ValueError
そのような項目がない場合。オプション引数startとendは、スライス表記リストの特定のサブシーケンスに検索を制限するために使用されます。返されるインデックスは、開始引数ではなく、完全なシーケンスの先頭を基準として計算されます。
注意点
リストの長さの線形時間計算量
呼び出しindex
は、一致するものが見つかるまで、リストのすべての要素を順番にチェックします。リストが長く、値が先頭近くにあるという保証がない場合は、コードの速度が低下する可能性があります。
この問題は、別のデータ構造を使用することによってのみ完全に回避できます。ただし、要素がリストの特定の部分内にあることがわかっている場合は、start
およびend
パラメータを使用して検索を絞り込むことができます。
例えば:
>>> import timeit
>>> timeit.timeit('l.index(999_999)', setup='l = list(range(0, 1_000_000))', number=1000)
9.356267921015387
>>> timeit.timeit('l.index(999_999, 999_990, 1_000_000)', setup='l = list(range(0, 1_000_000))', number=1000)
0.0004404920036904514
2 回目の呼び出しは、100 万個すべての要素ではなく 10 個の要素のみを検索するため、桁違いに高速になります。
最初の一致のインデックスのみが返されます
を呼び出すと、index
一致するものが見つかるまでリストを順番に検索し、そこで停止します。値が複数回出現する可能性があり、すべてのインデックスが必要な場合は、index
問題を解決できません。
>>> [1, 1].index(1) # the `1` index is not found.
0
代わりに、検索を行うためのリスト内包表記またはジェネレータ式、 とenumerate
インデックスを取得する:
>>> # A list comprehension gives a list of indices directly:
>>> [i for i, e in enumerate([1, 2, 1]) if e == 1]
[0, 2]
>>> # A generator comprehension gives us an iterable object...
>>> g = (i for i, e in enumerate([1, 2, 1]) if e == 1)
>>> # which can be used in a `for` loop, or manually iterated with `next`:
>>> next(g)
0
>>> next(g)
2
リストの理解とジェネレータ式のテクニックは、一致するものが 1 つだけの場合でも機能し、より一般化できます。
一致しない場合は例外が発生します
上記のドキュメントに記載されているように、.index
検索した値がリストにない場合は、を使用すると例外が発生します。
>>> [1, 1].index(2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: 2 is not in list
もしこれが懸念事項であるならば、最初に明示的に確認するを使用するか、必要に応じて/ を使用item in my_list
して例外を処理します。try
except
明示的なチェックはシンプルで読みやすいですが、リストを2回繰り返す必要があります。Python における EAFP 原則とは何ですか?この選択に関する詳しいガイダンスについては、こちらをご覧ください。