Pythonのリスト(list
)の要素位置を検索する方法(index
メソッド)について解説します。
Contents
リスト(list)の要素位置を返す ~ indexメソッド ~
Pythonでリスト中の特定要素が入っている位置を取得するにはindex
メソッドを使用します。
indexメソッドの基本的な使い方
リストのindex
メソッドの基本的な使い方を簡単な例を使用して説明します。
# リスト内の特定要素の位置を確認する data = ["A", "B", "C", "A", "B", "C", "D"] idx = data.index("B") print(f"idx: {idx}, data[idx]: {data[idx]}")
【実行結果】 idx: 1, data[idx]: B
リストの内容を先頭から順に検索をして、指定した要素が見つかった要素位置を返します。文字列のリストで説明していますが、数値のリスト等でも同様です。
上記例の場合、リストの中には複数の"B"
が含まれていますが、index
メソッドでは一番最初に検索された要素位置が返却される点に注意してください。
リストの検索開始位置、検索終了位置を指定する方法
index
メソッドでは、引数としてリストの検索開始位置と検索終了位置を指定することもできます。開始位置と終了位置を指定することで、リスト内の指定範囲の中を先頭から順に検索をして見つかった要素位置を返すことができます。
検索終了位置については省略した場合、リストの最後まで検索されます。
# 開始位置と終了位置を指定する。 data = ["A", "B", "C", "A", "B", "C", "D"] idx = data.index("B", 2, 5) print(f"idx: {idx}, data[idx]: {data[idx]}")
【実行結果】 idx: 4, data[idx]: B
開始位置と終了位置の指定方法は、リストのスライス構文と同じです。終了位置は対象に含まれないことに注意してください。上記例では、検索対象となるのは2~4番目の["C", "A", "B"]
であり、5番目の"C"
は対象に含まれていません。
indexメソッドの例外処理
index
メソッドは、list
(リスト)の中に指定した要素が見つからなかった場合に、ValueError
例外を返します。要素が見つからなかった場合の処理については、try
…except
で例外処理するようにしましょう。
# 要素が含まれていない場合の処理 data = ["A", "B", "C", "A", "B", "C", "D"] try: idx = data.index("Z") except ValueError as ex: print("Error:", ex)
【実行結果】 Error: 'Z' is not in list
例外処理については「例外処理(exception)の基本 ~ try, except, raise ~」にまとめていますので参考にしてください。
複数の要素位置を取得したい場合の対応方法
index
メソッドは、リストを先頭から順に検索をして見つかった要素位置のみを返します。しかし、リストの中に複数同じ要素が含まれていた場合には、すべての要素位置が知りたくなる場合があります。
このような場合の簡単な方法としては、以下例のようにリスト内包表記を用いる方法があります。
# 複数の要素位置を取得したい場合 data = ["A", "B", "C", "A", "B", "C", "D", "A", "B"] idx_list = [i for i, d in enumerate(data) if d == "B"] print(f"idx_list: {idx_list}")
【実行結果】 idx_list: [1, 4, 8]
上記例では、enumerate
関数を使って要素位置と値をfor文で取り出し、検索対象と一致する要素位置リストを生成することで実現しています。
リスト内包表記について確認したい場合は「リスト(list)内包表記の使い方」にまとめていますので興味があれば参考にしてください。
まとめ
Pythonのリスト(list
)の要素位置を検索する方法について解説しました。リスト中の特定の要素が入っている位置を取得する場合は、index
メソッドを使用します。
index
メソッドの基本的な使い方、例外処理、複数要素位置を取得したい場合の対処法などについて説明しました。
リスト内の要素位置を検索することはリスト操作の基本の一つなのでしっかりと使えるようになってください。
上記で紹介しているソースコードについてはgithubにて公開しています。参考にしていただければと思います。