原文: List Index Out of Range – Python Error Message Solved

この記事では、Python の list index out of range エラーの原因を解説します。

そもそもなぜこのエラーが起きるのかと併せて、エラーが起きないようにする対処法も説明します。

それでは始めましょう。

Python でリストを作成する方法

Python でリストオブジェクトを作成するのに必要な操作は次の通りです。

  • リストに名前を付けて、
  • 代入演算子 = を使用して、
  • 角括弧 [] の中に 0 個以上の要素を入れる (リストの各要素はカンマで区切る)

例えば、名前のリストを作るには次のようにします。

names = ["Kelly", "Nelly", "Jimmy", "Lenny"]

上記のコードでは、Kelly, Nelly, Jimmy, Lenny という 4 つの値を持つ、names という名前が付いたリストを作成しました。

Python でリストの長さを調べる

Python でリストの長さを調べるには、Python の組み込みメソッド len() を使います。

len() は、リストが持っている要素の数を表す整数を返します。

names = ["Kelly", "Nelly", "Jimmy", "Lenny"]

# リストの長さを格納する name_length という名前の変数を作成する
name_length = len(names)

# 変数の値をコンソールに出力する
print(name_length)

# 出力
# 4

このリストには 4 つの要素が格納されているので、リストの長さは 4 となります。

Python でリスト内の個別の要素にアクセスする方法

リスト内の各要素は、それぞれインデックス番号を持っています。

Python も含め、多くの近代的なプログラミング言語では、インデックスは 0 から始まります。

つまり、リスト内で最初の要素のインデックスは 0 で、二番目の要素のインデックスは 1、と続きます。

このインデックス番号を使ってそれぞれの要素にアクセスできます。

インデックス番号を使ってリスト内の要素にアクセスするには、まずリストの名前を記述します。続いて角括弧の中にインデックス番号を表す整数を入れます。

先ほどの例で使ったリストの場合、下記のようにしてインデックス番号を使ってリスト内の各要素にアクセスできます。

names = ["Kelly", "Nelly", "Jimmy", "Lenny"]

names[0] # Kelly
names[1] # Nelly
names[2] # Jimmy
names[3] # Lenny

また、Python ではリスト内の要素にアクセスするために負の数のインデックス番号を使うこともできます。

最後の要素にアクセスするには、インデックスの値を -1 にします。最後から 2 番目の要素にアクセスするには -2 という値を使用します。

こちらが負の数を使ってリスト内の各アイテムにアクセスする方法です。

names = ["Kelly", "Nelly", "Jimmy", "Lenny"]

names[-4] # Kelly
names[-3] # Nelly
names[-2] # Jimmy
names[-1] # Lenny

Python で Indexerror: list index out of range というエラーが起きるのはなぜ?

リストの範囲外のインデックス番号を使用している場合

リストのインデックスの範囲外、存在しない値を使用して要素にアクセスしようとすると、Indexerror: list index out of range エラーが発生します。

これは、リストの最後の要素にアクセスしようとした時や、最初の要素に負の数を使ってアクセスしようとしたときに良く起きるミスです。

ここまでの例で使ったリストをもう一度使って説明します。

names = ["Kelly", "Nelly", "Jimmy", "Lenny"]

最後の要素 "Lenny" にアクセスしようとして、次のコードを使ったとします。

print(names[4])

# 出力

# Traceback (most recent call last):
#   File "/Users/dionysialemonaki/python_articles/demo.py", line 3, in <module>
#     print(names[4])
# IndexError: list index out of range

通常、リストのインデックスの範囲は 0 から n-1 (n はリスト内の要素数) です。

上のリストの要素数は 4 なので、インデックスの範囲は 0 から 3 です。

では、今度は負の数のインデックスを使用してアクセスしてみましょう。

リスト内の最初の要素 "Kelly" に、負の数のインデックスを使ってアクセスしたいとします。

names = ["Kelly", "Nelly", "Jimmy", "Lenny"]

print(names[-5])

# 出力

# Traceback (most recent call last):
#   File "/Users/dionysialemonaki/python_articles/demo.py", line 3, in <module>
#     print(names[-5])
# IndexError: list index out of range

負の数のインデックスを使用するときには、インデックスの範囲は -1 から -n (n はリスト内の要素数) です。

リストの要素数が 4 なので、インデックスの範囲は -1 から -4 です。

Python の for ループで range() 関数に誤った値を使用している場合

リストの反復処理中に存在しない要素にアクセスしようとした場合も Indexerror: list index out of range が発生します。

これが起きるよくあるケースは、Python の range() 関数に誤った数を使用した場合です。

range() 関数は通常、カウントがストップする位置を表す 1 つの整数を引数に取ります。

例えば、range(5) はカウントが 0 から始まって 4 で終わることを表します。

つまりデフォルトでは、カウントは 0 からスタートして、1 ずつ増加し、指定の数まで増加しますが、指定された数はカウントに含まれません。

次の例を見てみましょう。

names = ["Kelly", "Nelly", "Jimmy", "Lenny"]

for name in range(5):
    print(names[name])
    
# 出力

# Kelly
# Nelly
# Jimmy
# Lenny
# Traceback (most recent call last):
#   File "/Users/dionysialemonaki/python_articles/demo.py", line 7, in <module>
#    print(names[name])
# IndexError: list index out of range

ここでは、リスト names は 4 つの値を持っています。

そのリストをループして、それぞれの値を出力しようとしました。

range(5) を使ったことにより、Python インタープリターに 0 から 4 の位置にある値を出力するよう指示したことになっています。

ですが、インデックス 4 の位置には要素がありません。

最初に位置番号を出力し、次にその位置にある値を出力することで問題を詳しく確認できます。

# 0
# Kelly
# 1
# Nelly
# 2
# Jimmy
# 3
# Lenny
# 4
# Traceback (most recent call last):
#   File "/Users/dionysialemonaki/python_articles/demo.py", line 8, in <module>
#     print(names[name])
# IndexError: list index out of range

0 の位置にあるのが "Kelly"、1 が "Nelly"、2 が "Jimmy"、3 が "Lenny" であることがわかります。

そして 0 から 4 の位置を表す range(5) を指定した通りにインデックス番号 4 の位置に来ると、出力するものがないので、インタープリターはエラーを発生させます。

これを修正する方法の 1 つは、range() で指定する数を小さくすることです。

names = ["Kelly", "Nelly", "Jimmy", "Lenny"]

for name in range(4):
    print(name)
    print(names[name])
    
# 出力

# 0
# Kelly
# 1
# Nelly
# 2
# Jimmy
# 3
# Lenny

このような for ループの場合に使えるもう 1 つの修正方法は、range() 関数の引数にリストの長さを渡すことです。この方法には前述した Python の組み込み関数 len() を使います。

names = ["Kelly", "Nelly", "Jimmy", "Lenny"]

for name in range(len(names)):
    print(names[name])

# 出力

# Kelly
# Nelly
# Jimmy
# Lenny

range() の引数として len() を渡す場合、次のようなミスをしないように注意してください。

names = ["Kelly", "Nelly", "Jimmy", "Lenny"]

for name in range(len(names) + 1):
    print(names[name])

上記のコードを実行すると、また IndexError: list index out of range エラーが発生してしまいます。

# Kelly
# Nelly
# Jimmy
# Lenny
# Traceback (most recent call last):
#   File "/Users/dionysialemonaki/python_articles/demo.py", line 4, in <module>
#     print(names[name])
# IndexError: list index out of range

まとめ

この記事が、IndexError: list index out of range のエラーが発生する理由とその回避策について理解を深める助けになれば幸いです。

Python についてもっと詳しく学習したい場合は、freeCodeCamp の Python 認定講座をぜひチェックしてください。初心者にもやさしく、インタラクティブに学べる講座です。講座の最後には 5 つのプロジェクトを通して学んだ内容を実践できます。

ここまでお読みいただきありがとうございました。Happy coding!