「リストの中で特定の値が何番目にあるのか知りたい」
「要素の位置を調べて、それに応じて処理を変えたい」
このような場面で便利なのが、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() とリスト内包表記 |
最後の出現位置 | リストを逆順にして検索 |
範囲指定検索 | start 、end パラメータ |
条件検索 | enumerate() で条件判定 |
コメント