リスト内の特定の項目のインデックスを見つけるにはどうすればいいですか? 質問する

リスト内の特定の項目のインデックスを見つけるにはどうすればいいですか? 質問する

リスト["foo", "bar", "baz"]とリスト内の項目が与えられた場合"bar"、そのインデックスを取得するにはどうすればよいでしょうか1?

ベストアンサー1

>>> ["foo", "bar", "baz"].index("bar")
1

見るドキュメント.index()リストの組み込みメソッドの場合:

list.index(x[, start[, end]])

リスト内で値がxに等しい最初の項目の0から始まるインデックスを返します。ValueErrorそのような項目がない場合。

オプション引数startendはスライス表記リストの特定のサブシーケンスに検索を制限するために使用されます。返されるインデックスは、開始引数ではなく、完全なシーケンスの先頭を基準として計算されます。

注意点

リストの長さの線形時間計算量

呼び出し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して例外を処理しますtryexcept

明示的なチェックはシンプルで読みやすいですが、リストを2回繰り返す必要があります。Python における EAFP 原則とは何ですか?この選択に関する詳しいガイダンスについては、こちらをご覧ください。

おすすめ記事