1. ホーム
  2. python

[解決済み] リスト内のアイテムのインデックスを検索する

2022-03-16 18:08:01

質問

リストがある場合 ["foo", "bar", "baz"] とリスト内のアイテム "bar" の場合、そのインデックスをどのように取得すればよいのでしょうか? 1 ) をPythonで作成できますか?

どのように解決するのですか?

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

参考 データ構造 > リストの詳細

注意事項が続きます

これは、おそらく質問に答えるための最もきれいな方法ですが、注意してください。 質問通り , index は、どちらかというと弱い成分で list このAPIを最後に怒りに任せて使ったのはいつだったか思い出せません。コメントで指摘されたのですが、この回答は大いに参考にされているので、もっと充実させるべきでしょう。に関するいくつかの注意点があります。 list.index が続きます。まずは、そのドキュメントを見てみるのがいいかもしれません。

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

と等しい値を持つ最初の項目の、リスト内のインデックスを0ベースで返します。 x . を発生させます。 ValueError は、そのような項目がない場合。

オプションの引数 開始 終了 のように解釈されます。 スライス表記 であり、リストの特定の部分配列に検索を限定するために使用されます。返されるインデックスは、 start 引数ではなく、完全なシーケンスの先頭を基準として計算されます。

リストの長さに対して線形的な時間複雑性

アン index は、リストのすべての要素を順番にチェックし、一致するものを見つけます。リストが長く、リストのどこでマッチするかわからない場合、この検索がボトルネックになる可能性があります。そのような場合は、別のデータ構造を検討する必要があります。どこにマッチするのかがだいたいわかっている場合は index をヒントにしてください。例えば、このスニペットでは l.index(999_999, 999_990, 1_000_000) は、まっすぐな l.index(999_999) というのも、前者は10個のエントリを検索すればよいのに対して、後者は100万個のエントリを検索するからです。

>>> 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
 

のインデックスのみを返します。 最初のマッチ を引数に

の呼び出しは index は、一致するものが見つかるまでリストを順に検索し で停止します。 より多くのマッチのインデックスが必要な場合は、リスト内包やジェネレータ式を使用する必要があります。

>>> [1, 1].index(1)
0
>>> [i for i, e in enumerate([1, 2, 1]) if e == 1]
[0, 2]
>>> g = (i for i, e in enumerate([1, 2, 1]) if e == 1)
>>> next(g)
0
>>> next(g)
2

かつて私が使っていたであろうほとんどの場所は index リスト内包やジェネレータ式の方が汎用性が高いので、今はそちらを使っています。ですから、もしあなたが index これらの優れたPythonの機能を見てみてください。

リストに要素がない場合に投げる

を呼び出すと index は、結果的に ValueError が存在しない場合

>>> [1, 1].index(2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: 2 is not in list

リスト内に項目が存在しない可能性がある場合は、以下のいずれかを行ってください。

  1. まず item in my_list (クリーンで読みやすいアプローチ)、または
  2. ラップ index の呼び出しは try/except をキャッチするブロック ValueError (少なくとも検索するリストが長く、アイテムが通常存在する場合は、おそらくより高速です)。