[解決済み] リスト内のアイテムのインデックスを検索する
質問
リストがある場合
["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
リスト内に項目が存在しない可能性がある場合は、以下のいずれかを行ってください。
-
まず
item in my_list
(クリーンで読みやすいアプローチ)、または -
ラップ
index
の呼び出しはtry/except
をキャッチするブロックValueError
(少なくとも検索するリストが長く、アイテムが通常存在する場合は、おそらくより高速です)。
関連
-
Python Decorator 練習問題
-
[解決済み】Pythonスクリプトで「Expected 2D array, got 1D array instead: 」というエラーが発生?
-
[解決済み] for'ループでインデックスにアクセスする?
-
[解決済み] リストのリストからフラットなリストを作るには?
-
[解決済み] Pythonのリストメソッドであるappendとextendの違いは何ですか?
-
[解決済み] リストの最後の要素を取得する方法
-
[解決済み] リストからランダムに項目を選択するにはどうすればよいですか?
-
[解決済み] インデックスを指定してリストから要素を削除する方法
-
[解決済み] リスト項目の出現回数を数えるにはどうしたらいいですか?
-
[解決済み】2つの辞書を1つの式でマージする(辞書の和をとる)には?)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
python string splicing.join()とsplitting.split()の説明
-
Python jiabaライブラリの使用方法について説明
-
pythonサイクルタスクスケジューリングツール スケジュール詳解
-
[解決済み】終了コード -1073741515 (0xC0000135)でプロセス終了)
-
[解決済み】 AttributeError: モジュール 'matplotlib' には属性 'plot' がない。
-
[解決済み】TypeErrorを取得しました。エントリを持つ子テーブルの後に親テーブルを追加しようとすると、 __init__() missing 1 required positional argument: 'on_delete'
-
[解決済み] 'int'オブジェクトに'__getitem__'属性がない。
-
[解決済み】Python Error: "ValueError: need more than 1 value to unpack" (バリューエラー:解凍に1つ以上の値が必要です
-
[解決済み】 'numpy.float64' オブジェクトは反復可能ではない
-
[解決済み】Python:リスト内の要素を見つける【重複あり