【Python入門】list.index()の使い方|要素の位置を検索する基本メソッドを徹底解説!

python

「リストの中で特定の値が何番目にあるのか知りたい」
「要素の位置を調べて、それに応じて処理を変えたい」

このような場面で便利なのが、Pythonのindex()メソッドです。index()を使うと、指定した要素がリストの中で最初に出現する位置(インデックス)を簡単に取得できます。

この記事では、index()の基本的な使い方から、エラー対策、範囲指定、応用テクニックまで、初心者の方にもわかりやすく解説します。

スポンサーリンク

indexメソッドの基本的な使い方

要素の位置を調べる

index()メソッドは、指定した要素がリストの中で最初に見つかった位置を返します。

fruits = ["りんご", "バナナ", "オレンジ"]
position = fruits.index("バナナ")
print(f"バナナの位置: {position}")

実行結果:

バナナの位置: 1

Pythonのリストでは、最初の要素が0番目、2番目の要素が1番目となることを覚えておきましょう。

インデックスの数え方

colors = ["赤", "青", "緑", "黄色"]

print(f"赤の位置: {colors.index('赤')}")      # 0
print(f"青の位置: {colors.index('青')}")      # 1
print(f"緑の位置: {colors.index('緑')}")      # 2
print(f"黄色の位置: {colors.index('黄色')}")   # 3

実行結果:

赤の位置: 0
青の位置: 1
緑の位置: 2
黄色の位置: 3

数値のリストでも同じように使える

numbers = [10, 20, 30, 40, 50]
position = numbers.index(30)
print(f"30の位置: {position}")

実行結果:

30の位置: 2

要素が見つからない場合のエラー対策

ValueErrorが発生する例

リストに存在しない要素を検索すると、エラーが発生します。

fruits = ["りんご", "バナナ", "オレンジ"]
# fruits.index("メロン")  # ValueError: 'メロン' is not in list

このコードを実行すると、以下のエラーが表示されます:

ValueError: 'メロン' is not in list

安全に検索する方法1:in演算子で事前チェック

エラーを防ぐために、まず要素がリストに含まれているかを確認します。

fruits = ["りんご", "バナナ", "オレンジ"]
search_fruit = "メロン"

if search_fruit in fruits:
    position = fruits.index(search_fruit)
    print(f"{search_fruit}の位置: {position}")
else:
    print(f"{search_fruit}はリストに含まれていません")

実行結果:

メロンはリストに含まれていません

安全に検索する方法2:try-except文を使用

エラーハンドリングを使った方法もあります。

fruits = ["りんご", "バナナ", "オレンジ"]
search_fruit = "バナナ"

try:
    position = fruits.index(search_fruit)
    print(f"{search_fruit}の位置: {position}")
except ValueError:
    print(f"{search_fruit}はリストに含まれていません")

実行結果:

バナナの位置: 1

安全な検索を行う関数を作る

再利用しやすいように、関数として作成することもできます。

def safe_index(lst, item):
    """安全にインデックスを取得する関数"""
    try:
        return lst.index(item)
    except ValueError:
        return -1  # 見つからない場合は -1 を返す

# 使用例
fruits = ["りんご", "バナナ", "オレンジ"]
print(f"バナナの位置: {safe_index(fruits, 'バナナ')}")  # 1
print(f"メロンの位置: {safe_index(fruits, 'メロン')}")  # -1

重複した要素がある場合の動作

最初に見つかった位置だけを返す

同じ要素が複数ある場合、index()は最初に見つかった位置だけを返します。

numbers = [1, 2, 3, 2, 4, 2]
position = numbers.index(2)
print(f"2の位置: {position}")

実行結果:

2の位置: 1

インデックス1、3、5に「2」がありますが、最初の位置(1)だけが返されます。

すべての出現位置を取得する方法

すべての位置を知りたい場合は、リスト内包表記とenumerate()を組み合わせます。

numbers = [1, 2, 3, 2, 4, 2]
target = 2

# すべての出現位置を取得
positions = [i for i, value in enumerate(numbers) if value == target]
print(f"{target}のすべての位置: {positions}")

実行結果:

2のすべての位置: [1, 3, 5]

for文を使った方法

numbers = [1, 2, 3, 2, 4, 2]
target = 2
positions = []

for i, value in enumerate(numbers):
    if value == target:
        positions.append(i)

print(f"{target}のすべての位置: {positions}")

実行結果:

2のすべての位置: [1, 3, 5]

範囲を指定して検索する

開始位置を指定する

検索を開始する位置を指定できます。

numbers = [1, 2, 3, 2, 4, 2]

# 全体から検索
first_pos = numbers.index(2)
print(f"最初の2の位置: {first_pos}")

# インデックス2以降から検索
second_pos = numbers.index(2, 2)
print(f"2番目以降の2の位置: {second_pos}")

# インデックス4以降から検索
third_pos = numbers.index(2, 4)
print(f"3番目以降の2の位置: {third_pos}")

実行結果:

最初の2の位置: 1
2番目以降の2の位置: 3
3番目以降の2の位置: 5

開始位置と終了位置を指定する

検索範囲を限定することもできます。

numbers = [1, 2, 3, 2, 4, 2]

# インデックス0から3未満の範囲で検索
position = numbers.index(2, 0, 3)
print(f"インデックス0~2の範囲での2の位置: {position}")

# インデックス2から5未満の範囲で検索
position2 = numbers.index(2, 2, 5)
print(f"インデックス2~4の範囲での2の位置: {position2}")

実行結果:

インデックス0~2の範囲での2の位置: 1
インデックス2~4の範囲での2の位置: 3

範囲指定の書き方まとめ

書き方意味
list.index(x)全体から検索numbers.index(2)
list.index(x, start)start以降から検索numbers.index(2, 2)
list.index(x, start, end)start以上end未満で検索numbers.index(2, 0, 3)

実用的な使用例

条件分岐での活用

要素の位置によって処理を変える例:

students = ["田中", "佐藤", "鈴木", "高橋"]
target_student = "鈴木"

if target_student in students:
    position = students.index(target_student)
    if position == 0:
        print(f"{target_student}さんは1番目です")
    elif position < len(students) // 2:
        print(f"{target_student}さんは前半にいます")
    else:
        print(f"{target_student}さんは後半にいます")

実行結果:

鈴木さんは後半にいます

要素の交換

2つの要素の位置を入れ替える例:

colors = ["赤", "青", "緑", "黄色"]
print(f"交換前: {colors}")

# 「青」と「緑」を交換
blue_pos = colors.index("青")
green_pos = colors.index("緑")

colors[blue_pos], colors[green_pos] = colors[green_pos], colors[blue_pos]
print(f"交換後: {colors}")

実行結果:

交換前: ['赤', '青', '緑', '黄色']
交換後: ['赤', '緑', '青', '黄色']

特定の要素より前にある要素を取得

animals = ["犬", "猫", "鳥", "魚", "うさぎ"]
target = "鳥"

if target in animals:
    position = animals.index(target)
    before_animals = animals[:position]
    print(f"{target}より前にいる動物: {before_animals}")

実行結果:

鳥より前にいる動物: ['犬', '猫']

最後に出現する位置を調べる

リストを逆順にして検索し、元の位置に変換する方法:

numbers = [1, 2, 3, 2, 4, 2]
target = 2

# 最後の出現位置を取得
reversed_list = numbers[::-1]
last_pos_from_end = reversed_list.index(target)
last_pos = len(numbers) - 1 - last_pos_from_end

print(f"{target}の最後の出現位置: {last_pos}")

実行結果:

2の最後の出現位置: 5

データ処理での活用

CSVデータのような2次元リストでの活用例:

# 成績データ(名前、数学、英語)
grades = [
    ["田中", 85, 78],
    ["佐藤", 92, 88],
    ["鈴木", 76, 95],
    ["高橋", 88, 82]
]

# 特定の学生のデータを取得
target_name = "鈴木"
for row in grades:
    if target_name in row:
        name_pos = row.index(target_name)
        math_score = row[name_pos + 1]
        english_score = row[name_pos + 2]
        print(f"{target_name}さんの成績: 数学{math_score}点, 英語{english_score}点")
        break

実行結果:

鈴木さんの成績: 数学76点, 英語95点

他の検索メソッドとの比較

index、in、countの違い

メソッド用途戻り値エラー発生
index()要素の位置を取得インデックス(整数)あり(ValueError)
in要素の存在確認True/Falseなし
count()要素の出現回数回数(整数)なし

実際の比較例

fruits = ["りんご", "バナナ", "オレンジ", "バナナ"]

# index(): 位置を取得
print(f"バナナの位置: {fruits.index('バナナ')}")

# in: 存在確認
print(f"バナナはある?: {'バナナ' in fruits}")

# count(): 出現回数
print(f"バナナの個数: {fruits.count('バナナ')}")

実行結果:

バナナの位置: 1
バナナはある?: True
バナナの個数: 2

使い分けの指針

  • 位置を知りたいindex()
  • 存在するかだけ知りたいin
  • 個数を知りたいcount()

パフォーマンスの考慮

大きなリストでの検索

import time

# 大きなリストを作成
big_list = list(range(1000000))
target = 999999

# 検索時間の測定
start_time = time.time()
position = big_list.index(target)
end_time = time.time()

print(f"検索時間: {end_time - start_time:.6f}秒")
print(f"位置: {position}")

効率的な検索のヒント

# 頻繁に検索する場合は辞書を使用する方が効率的
data_list = ["apple", "banana", "cherry", "date"]

# リストから辞書に変換(値→インデックス)
data_dict = {value: index for index, value in enumerate(data_list)}

# 辞書での検索(O(1))
target = "cherry"
if target in data_dict:
    position = data_dict[target]
    print(f"{target}の位置: {position}")

よくある質問と解決方法

Q: 大文字小文字を区別せずに検索したい

words = ["Apple", "banana", "Cherry"]
target = "apple"

# 大文字小文字を統一してから検索
lower_words = [word.lower() for word in words]
if target.lower() in lower_words:
    position = lower_words.index(target.lower())
    print(f"{target}の位置: {position}")

Q: 複数の値のどれかが含まれているか調べたい

fruits = ["りんご", "バナナ", "オレンジ"]
targets = ["メロン", "バナナ", "ぶどう"]

found_items = []
for target in targets:
    if target in fruits:
        position = fruits.index(target)
        found_items.append((target, position))

print(f"見つかった要素: {found_items}")

実行結果:

見つかった要素: [('バナナ', 1)]

Q: 条件に合う要素のインデックスを取得したい

numbers = [1, 15, 23, 8, 42, 7]

# 20より大きい最初の数の位置
for i, num in enumerate(numbers):
    if num > 20:
        print(f"20より大きい最初の数{num}の位置: {i}")
        break

実行結果:

20より大きい最初の数23の位置: 2

まとめ

index()メソッドは、リスト内の要素の位置を調べるための基本的で重要な機能です。

重要なポイント

  • index()は最初に見つかった位置を返す
  • 要素が見つからない場合はValueErrorが発生
  • 範囲を指定して検索することも可能
  • 重複要素がある場合は最初の位置のみ取得

エラー対策

  • in演算子で事前チェック
  • try-except文でエラーハンドリング
  • 安全な検索関数を自作

応用テクニック

目的方法
すべての出現位置enumerate()とリスト内包表記
最後の出現位置リストを逆順にして検索
範囲指定検索startendパラメータ
条件検索enumerate()で条件判定

コメント

タイトルとURLをコピーしました