MENU

Pythonの「IndexError: list index out of range」の直し方|原因と対処法を解説

Pythonでリストを扱っていると、「IndexError: list index out of range」というエラーが表示されることがあります。

英語だけを見ると難しそうですが、内容は単純です。このエラーは、「リストに存在しない位置を指定している」ときに発生します。

この記事では、エラーが起きる主な原因と直し方を、初心者向けに解説します。

目次

IndexError: list index out of rangeとは

「IndexError: list index out of range」は、指定したインデックスがリストの範囲を超えていることを示すエラーです。

インデックスとは、リスト内の要素に割り当てられた位置番号です。

fruits = ["りんご", "みかん", "バナナ"]

print(fruits[0])  # りんご
print(fruits[1])  # みかん
print(fruits[2])  # バナナ

Pythonのインデックスは「0」から始まります。

要素が3つある場合、使用できるインデックスは「0」「1」「2」です。「3」を指定すると、4番目の要素を取得しようとするためエラーになります。

fruits = ["りんご", "みかん", "バナナ"]

# インデックス3の要素は存在しない
print(fruits[3])

実行すると、次のエラーが表示されます。

IndexError: list index out of range

このエラーは、リストそのものが壊れているという意味ではありません。「指定した位置に要素がない」と教えてくれています。

原因1:要素数とインデックスを同じだと思っている

初心者が間違えやすいのが、要素数と最後のインデックスを混同することです。

numbers = [10, 20, 30]

print(len(numbers))  # 3

「len()」で調べた要素数は「3」ですが、最後のインデックスは「2」です。

要素数:3
使用できるインデックス:0、1、2

最後の要素を取得したい場合は、要素数から「1」を引きます。

numbers = [10, 20, 30]

# 要素数から1を引いて最後の位置を求める
last_index = len(numbers) - 1

print(numbers[last_index])  # 30

Pythonでは、負のインデックスを使って末尾から数えることもできます。

numbers = [10, 20, 30]

# -1は最後の要素を表す
print(numbers[-1])  # 30

最後の要素を取得するだけなら、「-1」を使うほうが短く分かりやすいでしょう。

原因2:range()の範囲を1つ増やしている

for文でインデックスを使うときにも、範囲を超えることがあります。

次のコードには「+ 1」が付いているため、最後に存在しない位置へアクセスします。

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

# 最後にインデックス3も作られてしまう
for i in range(len(colors) + 1):
    print(colors[i])

「range(len(colors) + 1)」では、「0」「1」「2」「3」が順番に作られます。しかし、リストで使用できるのは「2」までです。

「+ 1」を削除すればエラーを直せます。

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

# 要素数と同じ範囲で繰り返す
for i in range(len(colors)):
    print(colors[i])

インデックスが必要なければ、リストから要素を直接取り出す方法がより簡単です。

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

# 要素を直接取り出す
for color in colors:
    print(color)

位置と要素の両方が必要な場合は、「enumerate()」を使えます。

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

# インデックスと要素を同時に取得
for i, color in enumerate(colors):
    print(i, color)

インデックスを自分で作らずに済むため、範囲を間違える可能性を減らせます。

原因3:空のリストから要素を取得している

要素が一つもない空のリストでは、「0」を指定してもエラーになります。

items = []

# 最初の要素が存在しないためエラーになる
print(items[0])

空のリストには、使用できるインデックスがありません。

要素を取得する前にリストの中身を確認すると安全です。

items = []

# リストに要素がある場合だけ取得する
if items:
    print(items[0])
else:
    print("データがありません")

「if items:」は、リストが空でなければ真になります。

この確認は、検索結果やユーザー入力など、データが存在するとは限らない場面で役立ちます。

原因4:削除後のリストを以前と同じ位置で参照している

リストから要素を削除すると、要素数やインデックスが変わります。

tasks = ["確認", "入力", "送信"]

# 最後の要素を削除
tasks.pop()

# 削除前に存在したインデックス2を指定
print(tasks[2])

「pop()」を実行したあとのリストは、次の状態です。

["確認", "入力"]

使用できるインデックスは「0」「1」だけなので、「2」を指定するとエラーになります。

削除後のリストを扱う場合は、現在の要素数を基準に考えましょう。

tasks = ["確認", "入力", "送信"]

# 最後の要素を削除
tasks.pop()

# 現在の最後の要素を取得
if tasks:
    print(tasks[-1])  # 入力

リストは追加や削除によって長さが変化します。一度確認した位置が、あとでも有効とは限りません。

原因5:入力された番号をそのまま使っている

ユーザーが入力する番号は「1番目」から始まることが多い一方、Pythonのインデックスは「0」から始まります。

この違いを調整しないと、範囲外の位置を指定することがあります。

fruits = ["りんご", "みかん", "バナナ"]

number = int(input("何番目を表示しますか: "))

# 入力された番号をそのまま使うと位置がずれる
print(fruits[number])

人が使う番号をインデックスへ変換するには、「1」を引きます。

fruits = ["りんご", "みかん", "バナナ"]

number = int(input("何番目を表示しますか: "))
index = number - 1

# 入力された番号が有効か確認する
if 0 <= index < len(fruits):
    print(fruits[index])
else:
    print("その番号のデータはありません")

「0 <= index < len(fruits)」では、インデックスが有効な範囲に入っているかを確認しています。

ユーザーがどのような数字を入力しても、すぐにリストへアクセスせず、先に範囲を確認することが大切です。

スライスでは範囲を超えてもエラーにならない

リストから複数の要素を取り出す「スライス」は、通常のインデックス指定と動作が異なります。

numbers = [10, 20, 30]

# 終了位置が要素数を超えていてもエラーにならない
print(numbers[0:10])  # [10, 20, 30]

「numbers[10]」のように1つの位置を指定するとエラーになりますが、「numbers[0:10]」のようなスライスでは、存在する範囲だけが返されます。

numbers = [10, 20, 30]

# 1つの位置を指定するとエラーになる
print(numbers[10])

この違いを知っておくと、「同じように範囲を超えているのに、なぜ片方だけエラーになるのか」と迷わずに済みます。

エラーが出たときの確認手順

「IndexError: list index out of range」が出たら、次の順番で確認すると原因を見つけやすくなります。

  1. エラーが発生した行を確認する
  2. リストの内容を表示する
  3. 「len()」で要素数を調べる
  4. 指定しているインデックスを表示する
  5. 追加や削除によって長さが変わっていないか確認する

次のように、リストとインデックスをエラーの直前で表示する方法が有効です。

numbers = [10, 20, 30]
index = 3

# 現在の状態を確認する
print("リスト:", numbers)
print("要素数:", len(numbers))
print("指定位置:", index)

print(numbers[index])

この例では、要素数が「3」であるのに、インデックス「3」を指定していることが分かります。

エラーメッセージだけを見るのではなく、「実際のリスト」「指定した位置」を並べて確認するのが解決への近道です。

まとめ

「IndexError: list index out of range」は、リストに存在しない位置を指定したときに発生します。

主な原因は次のとおりです。

  • 要素数と最後のインデックスを混同している
  • 「range()」の範囲を1つ増やしている
  • 空のリストから要素を取得している
  • 要素の削除後も以前と同じ位置を使っている
  • ユーザーの入力値をそのままインデックスにしている

Pythonのインデックスは「0」から始まるため、要素数が「3」なら使用できる位置は「0」から「2」までです。

エラーが出たときは、リストが壊れたと考えるのではなく、「今のリストに、その位置は本当に存在するか」と確認してみましょう。

リストの内容、要素数、指定したインデックスの3つを表示すれば、多くの場合は原因を見つけられます。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次