PythonのIndexErrorとは?意味・原因・直し方を初心者向けに解説

ながみえ

Pythonでリストや文字列から値を取り出そうとしたときに、IndexErrorというエラーが表示されることがあります。

特によく見るのが、IndexError: list index out of range というエラーメッセージです。これは、リストの中に存在しない番号を指定したときに発生します。

初心者のうちは、「リストには値が入っているのに、なぜエラーになるの?」と迷ってしまうことも多いです。原因の多くは、インデックス番号の数え方や、リストの要素数の確認ミスにあります。

この記事では、PythonのIndexErrorの意味、よくある原因、エラーが出るコード例、修正方法を初心者向けに解説します。

Pythonでよく出るエラーを一覧で確認したい方は、Pythonエラー一覧も参考にしてください↓↓

あわせて読みたい
Pythonエラー一覧|よくあるエラーの意味・原因・直し方
Pythonエラー一覧|よくあるエラーの意味・原因・直し方
あわせて読みたい
【完全無料】Python初心者向け完全ガイド
【完全無料】Python初心者向け完全ガイド

IndexErrorとは

IndexErrorとは、リスト・タプル・文字列などから値を取り出すときに、存在しないインデックス番号を指定すると発生するエラーです。

インデックス番号とは、要素の位置を表す番号のことです。Pythonでは、リストの先頭を「1番目」ではなく「0番目」として数えます。

たとえば、次のようなリストがあるとします。

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

このリストには、3つの要素が入っています。ただし、使えるインデックス番号は 012 です。

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

print(fruits[0])
print(fruits[1])
print(fruits[2])

実行すると、次のように表示されます。

りんご
バナナ
みかん

ここで注意したいのは、要素が3個あるからといって、fruits[3] が使えるわけではないという点です。

次のコードを見てみましょう。

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

print(fruits[3])

このコードを実行すると、IndexErrorが発生します。

IndexError: list index out of range

fruits[3] は、リストの4番目の要素を取り出そうとしている書き方です。しかし、このリストには3つの要素しかありません。そのため、Pythonは「指定された番号の要素が見つからない」と判断し、IndexErrorを表示します。

IndexErrorが出たときは、まず「指定しているインデックス番号が、リストの範囲内にあるか」を確認しましょう。

リストの要素数は、len() を使うと確認できます。

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

print(len(fruits))

この場合、表示される数は 3 です。ただし、最後のインデックス番号は 3 ではなく、2 になります。

つまり、リストの最後の要素を通常のインデックスで取り出す場合は、次のように考えると分かりやすいです。

最後のインデックス番号 = len(リスト) - 1

IndexErrorは、Python初心者がよくつまずくエラーですが、仕組みはとてもシンプルです。リストの番号は0から始まり、最後の番号は「要素数より1小さい数」になると覚えておきましょう。

IndexErrorが起きる主な原因

IndexErrorは、取り出そうとしている番号と、実際に存在する要素の数が合っていないときに発生します。

特に初心者のうちは、リストのインデックスが0から始まることを忘れてしまい、最後の要素を取り出すつもりで範囲外の番号を指定してしまうことがあります。

IndexErrorが起きる主な原因を整理すると、次のようになります。

原因内容確認すること
存在しない番号を指定している要素数より大きいインデックスを使っている最後のインデックスは len(リスト) - 1 になっているか
インデックスが0から始まることを忘れている1番目を 1、2番目を 2 と考えている先頭の要素は 0 で指定する
空のリストから値を取り出している要素がないのに list[0] のように書いているリストに要素が入っているか
for文の繰り返し範囲が広すぎるrange() の指定がリストの長さを超えているrange(len(リスト)) になっているか
入力された番号をそのまま使っているユーザーが入力した「1番目」をそのままインデックスにしている必要に応じて入力値から1を引く
リストの中身を削除した後にアクセスしている要素を削除したあと、以前と同じ番号で取り出そうとしている削除後の要素数を確認する
二次元リストの行や列を間違えている行番号や列番号が範囲外になっている行数と列数を分けて確認する

たとえば、次のようなリストがあるとします。

numbers = [10, 20, 30]

このリストには3つの要素がありますが、使えるインデックスは 012 だけです。

そのため、次のように numbers[3] を指定するとエラーになります。

numbers = [10, 20, 30]

print(numbers[3])

このコードでは、4番目の要素を取り出そうとしています。しかし、numbers には3つの要素しかないため、IndexErrorが発生します。

また、空のリストにも注意が必要です。

items = []

print(items[0])

空のリストには、0番目の要素も存在しません。そのため、items[0] と書いても値を取り出すことはできません。

IndexErrorを直すときは、「リストに何個の要素があるか」と「何番目の要素を取り出そうとしているか」をセットで確認することが大切です。

リストの要素数は、len() を使うと簡単に調べられます。

items = []

print(len(items))

このコードでは、リストが空なので 0 と表示されます。

IndexErrorが出たときは、いきなりコード全体を見直すのではなく、まずエラーが出ている行のリストとインデックス番号を確認しましょう。多くの場合、指定している番号がリストの範囲を超えていることが原因です。

IndexErrorのエラー例と修正例

ここからは、IndexErrorが実際にどのようなコードで発生するのかを見ていきましょう。

IndexErrorは、原因だけを見ると「リストの範囲外を指定している」というシンプルなエラーです。しかし、実際のコードでは、for文やユーザー入力、空のリスト、二次元リストなど、いろいろな場面で発生します。

よくあるパターンごとに、エラーになる例と修正例を確認していきます。

リストの範囲外を指定している例

まずは、もっとも基本的なIndexErrorの例です。

次のコードでは、リストの中にある果物の名前を取り出そうとしています。

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

print(fruits[3])

このコードを実行すると、次のようなエラーが発生します。

IndexError: list index out of range

fruits には、3つの要素が入っています。ただし、Pythonのインデックスは0から始まるため、使える番号は 012 です。

fruits[3] は4番目の要素を取り出そうとしているため、リストの範囲外になります。

修正するには、存在するインデックス番号を指定します。

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

print(fruits[2])

このコードでは、fruits[2] によって3番目の要素である「みかん」を取り出しています。

みかん

リストの要素数が3個の場合、最後のインデックスは 3 ではなく 2 です。この数え方を間違えると、IndexErrorが発生しやすくなります。

for文の繰り返し範囲が1つ多い例

IndexErrorは、for文でリストの要素を順番に取り出すときにもよく発生します。

次のコードを見てみましょう。

scores = [80, 90, 70]

for i in range(4):
    print(scores[i])

scores には3つの要素しかありません。しかし、range(4)0123 の4回繰り返します。

そのため、最後の繰り返しで scores[3] を取り出そうとして、IndexErrorが発生します。

この場合は、リストの長さに合わせて繰り返すように修正します。

scores = [80, 90, 70]

for i in range(len(scores)):
    print(scores[i])

len(scores)3 なので、range(len(scores))012 の範囲になります。これなら、リストの範囲外を指定することはありません。

実行結果は次のようになります。

80
90
70

ただし、リストの要素を順番に表示するだけなら、インデックス番号を使わない書き方の方が簡単です。

scores = [80, 90, 70]

for score in scores:
    print(score)

この書き方では、リストの中身を1つずつ直接取り出しています。インデックス番号を自分で指定しないため、IndexErrorを防ぎやすくなります。

空のリストから値を取り出している例

空のリストから値を取り出そうとした場合も、IndexErrorが発生します。

次のコードを見てみましょう。

items = []

print(items[0])

items は空のリストです。つまり、リストの中には何も入っていません。

空のリストには0番目の要素も存在しないため、items[0] と書くとIndexErrorになります。

IndexError: list index out of range

このような場合は、値を取り出す前に、リストに要素が入っているかを確認します。

items = []

if len(items) > 0:
    print(items[0])
else:
    print("リストは空です")

このコードでは、len(items) > 0 によって、リストに要素があるかを確認しています。

リストが空の場合は、値を取り出さずに「リストは空です」と表示します。

リストは空です

Pythonでは、空のリストは条件式の中で False として扱われます。そのため、次のように書くこともできます。

items = []

if items:
    print(items[0])
else:
    print("リストは空です")

この書き方でも、リストに要素が入っている場合だけ items[0] を取り出すことができます。

初心者のうちは、まず len() を使った書き方で考えると分かりやすいです。慣れてきたら、if items: のような書き方も使えるようになるとよいでしょう。

ユーザー入力の番号をそのまま使っている例

ユーザーに番号を入力してもらい、その番号に対応するリストの要素を表示する場合にも、IndexErrorが起きやすくなります。

次のコードを見てみましょう。

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

number = int(input("何番目の果物を表示しますか?:"))
print(fruits[number])

たとえば、ユーザーが 3 と入力したとします。

人間の感覚では、「3番目の果物」といえば「みかん」を想像するかもしれません。しかし、Pythonではインデックスが0から始まります。

そのため、fruits[3] は3番目ではなく、4番目の要素を取り出す指定になります。

このリストに4番目の要素はないため、IndexErrorが発生します。

この場合は、入力された番号から1を引いて、Pythonのインデックス番号に変換します。

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

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

print(fruits[index])

ユーザーが 3 と入力した場合、index2 になります。これで、fruits[2] として「みかん」を取り出せます。

ただし、このままだと、ユーザーが存在しない番号を入力したときにエラーになる可能性があります。

たとえば、10 と入力された場合、index9 になり、リストの範囲外になります。

より安全にするには、取り出す前に範囲を確認します。

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

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

if 0 <= index < len(fruits):
    print(fruits[index])
else:
    print("その番号の果物はありません")

このコードでは、0 <= index < len(fruits) によって、インデックスがリストの範囲内にあるかを確認しています。

ユーザー入力を使う場合は、想定外の番号が入力されることもあります。入力された値をそのまま使うのではなく、リストの範囲内かどうかを確認してから使うようにしましょう。

二次元リストで行や列の番号を間違えている例

二次元リストを使うときにも、IndexErrorが発生することがあります。

二次元リストとは、リストの中にさらにリストが入っている形のことです。表やゲームの盤面のようなデータを扱うときによく使われます。

次のコードを見てみましょう。

board = [
    ["○", "×", "○"],
    ["×", "○", "×"]
]

print(board[2][0])

この board は、2行3列の二次元リストです。

行番号として使えるのは 01 だけです。しかし、コードでは board[2][0] と書いています。

board[2] は3行目を指定する書き方ですが、この二次元リストには3行目がありません。そのため、IndexErrorが発生します。

修正するには、存在する行番号を指定します。

board = [
    ["○", "×", "○"],
    ["×", "○", "×"]
]

print(board[1][0])

このコードでは、2行目の1列目にある値を取り出しています。

×

二次元リストでは、行と列を分けて考えることが大切です。

board[行番号][列番号]

たとえば、board[1][0] は「2行目の1列目」を意味します。行番号も列番号も0から始まるため、見た目の位置とインデックス番号が1つずれる点に注意しましょう。

二次元リストでIndexErrorが出たときは、行数と列数をそれぞれ確認すると原因を見つけやすくなります。

IndexErrorに関するよくある質問

最後に、IndexErrorについて初心者の方が疑問に思いやすいポイントを整理します。

IndexErrorは、リストの範囲外を指定したときに発生するエラーですが、似たような書き方でもエラーにならない場合があります。

ここでは、よくある質問を通して、IndexErrorの理解を深めていきましょう。

IndexError: list index out of range とはどういう意味ですか?

IndexError: list index out of range は、「リストの範囲外のインデックス番号を指定しています」という意味です。

たとえば、次のコードを見てみましょう。

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

print(fruits[3])

fruits には3つの要素がありますが、使えるインデックス番号は 012 です。

fruits[3] は4番目の要素を取り出そうとしているため、リストの範囲外になります。その結果、IndexErrorが発生します。

修正するには、存在するインデックス番号を指定します。

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

print(fruits[2])

このコードでは、3番目の要素である「みかん」を取り出せます。

リストの最後の要素を取り出すにはどうすればよいですか?

リストの最後の要素を取り出すには、-1 を使う方法があります。

Pythonでは、負のインデックスを使って後ろから要素を指定できます。

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

print(fruits[-1])

実行結果は次のようになります。

みかん

fruits[-1] は、リストの最後の要素を表します。

後ろから2番目を取り出したい場合は、-2 を使います。

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

print(fruits[-2])

実行結果は次のようになります。

バナナ

ただし、負のインデックスでも、リストの範囲を超えるとIndexErrorになります。

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

print(fruits[-4])

このリストには3つの要素しかないため、fruits[-4] は範囲外になります。

スライスで範囲外を指定してもIndexErrorにならないのはなぜですか?

通常のインデックス指定では、範囲外の番号を指定するとIndexErrorになります。

しかし、スライスを使った場合は、範囲外の番号を指定してもIndexErrorにならないことがあります。

たとえば、次のコードを見てみましょう。

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

print(fruits[0:10])

このコードでは、0番目から9番目までを取り出そうとしています。

fruits には3つの要素しかありませんが、スライスでは取り出せる範囲だけが返されます。

実行結果は次のようになります。

['りんご', 'バナナ', 'みかん']

一方、通常のインデックス指定では、範囲外の番号を指定するとエラーになります。

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

print(fruits[10])

この場合は、10番目の要素が存在しないため、IndexErrorが発生します。

つまり、通常のインデックス指定とスライスでは、範囲外を指定したときの動きが少し違います。

書き方範囲外を指定した場合
通常のインデックス指定IndexErrorになるfruits[10]
スライス取り出せる範囲だけ返されるfruits[0:10]

スライスは、指定した範囲の中で存在する要素だけを取り出すため、通常のインデックス指定よりも柔軟に使えます。

IndexErrorをtry-exceptで処理してもよいですか?

IndexErrorは、try-except を使って処理することもできます。

たとえば、次のように書くと、範囲外のインデックスを指定してもプログラムが途中で止まらないようにできます。

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

try:
    print(fruits[index])
except IndexError:
    print("指定した番号の要素はありません")

実行結果は次のようになります。

指定した番号の要素はありません

ただし、初心者のうちは、すぐに try-except でエラーを処理するよりも、まず原因を確認することが大切です。

IndexErrorは、リストの要素数とインデックス番号を確認すれば原因を見つけやすいエラーです。エラーを隠すのではなく、「なぜ範囲外になっているのか」を確認する習慣をつけましょう。

文字列でもIndexErrorは発生しますか?

文字列でもIndexErrorは発生します。

Pythonでは、文字列もリストと同じようにインデックス番号で1文字ずつ取り出すことができます。

text = "Python"

print(text[0])

実行結果は次のようになります。

P

ただし、存在しない番号を指定すると、文字列でもIndexErrorになります。

text = "Python"

print(text[10])

このコードでは、10番目の文字を取り出そうとしています。しかし、"Python" は6文字なので、10番目の文字は存在しません。

そのため、次のようなエラーが発生します。

IndexError: string index out of range

リストの場合は list index out of range、文字列の場合は string index out of range と表示されます。

どちらも、存在しないインデックス番号を指定しているという意味は同じです。

まとめ|IndexErrorはリストの範囲を確認しよう

IndexErrorは、リスト・タプル・文字列などで、存在しないインデックス番号を指定したときに発生するエラーです。

特に、IndexError: list index out of range は、Python初心者がよく出会うエラーのひとつです。要素が3個あるリストで使えるインデックスは 012 のように、Pythonのインデックスは0から始まる点に注意しましょう。

IndexErrorが出たときは、まず len() を使ってリストの要素数を確認し、指定しているインデックス番号が範囲内にあるかを見直すことが大切です。

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

print(len(fruits))

リストの最後のインデックス番号は、基本的に次のように考えます。

len(リスト) - 1

また、for文でリストを順番に処理するだけなら、インデックス番号を使わずに、次のように要素を直接取り出す書き方もおすすめです。

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

for fruit in fruits:
    print(fruit)

IndexErrorは、原因が分かれば直しやすいエラーです。エラーが出たときは、あわてずに「リストの要素数」と「指定しているインデックス番号」を確認してみましょう。

Pythonでよく出るエラーをまとめて確認したい方は、Pythonエラー一覧も参考にしてください↓↓

あわせて読みたい
Pythonエラー一覧|よくあるエラーの意味・原因・直し方
Pythonエラー一覧|よくあるエラーの意味・原因・直し方
あわせて読みたい
【完全無料】Python初心者向け完全ガイド
【完全無料】Python初心者向け完全ガイド
記事URLをコピーしました