Pythonのリストで「list assignment index out of range」というエラーが出る場合の一例とその解決方法

Pythonで空のリストを作って使う場合のちょっとした初歩的な注意点。エラーメッセージ「list assignment index out of range」の対処法と考え方

今日はプログラミングをゼロから始めたPython初心者が最初につまづきやすい点についての解決方法・考え方についての解説です。

それは、リストを作ったときに、エラー「list assignment index out of range」が出てしまうという場合のものです。

今回はそのある1つの例を解説します。

プログラミング言語の人気オンラインコース

「list assignment index out of range」というエラーメッセージ

Pythonで新しく空のリストを作って、それを使おうとしたときに、以下のようなエラーメッセージが出ることがあります。

list assignment index out of range

この意味は、乱暴に言ってしまうと「リストの中身の数がおかしいよ」というものです。リストを構成する要素の数にミスがあるというものです。

要素の内容・性質そのものではなく、要素の数ということに注意してください。

たとえば、次のようなコードを書いた場合です。

new_list=[]
new_list[0]='apple'
new_list[1]='orange'

解決方法の解説

空のリストを作る場合の注意点

再び上のコードをそのまま掲載します。

new_list=[]  # ①
new_list[0]='apple'  # ②
new_list[1]='orange'  # ③

これの何がおかしいかわかるでしょうか。

まず最初にnew_listとして要素の数がゼロ個、つまり何も入っていない空のリストを作っています。

リストの要素の数を実際に確かめてみましょう。

len(new_list)  # 結果:0

このようにゼロになります。

では一番上のコードの何がおかしいかわかるでしょうか。

new_list[0]='apple'  # ②

この部分は、new_list[0]に文字列appleを代入しようとしているわけですが、それにはそもそも左辺の「new_list[0]」という情報が存在している必要があります。

new_list[0]は、new_listの「最初の要素を指定」していますね

ところが、new_listはそもそも中身が空っぽであるために、「最初の要素」そのものが存在していないわけです。

実際に、別のリストを作って違いを見てみましょう。

# 上のコードと同じもの
new_list=[]  
len(new_list)  # 結果:0

# 比較用に別のリストone_list(要素は文字列apple)を作ってみる
one_list=['apple']
len(one_list)  # 結果:1
print(one_list[0])  # 結果:apple

いかがでしょう。要素の個数が0と1で異なった結果になっていますよね。

以上より、空のリストは中身が空っぽであるため、そもそも「最初の要素」が存在していないため、「最初の要素を取り出す」とか「最初の要素を変更する」ということがそもそも不可能だとわかります。これは「最初の要素」だろうが「N番目の要素」だろうが同じことです。

こうした理由により、そもそも空っぽのリストの要素を指定して、

new_list[0]='apple'

とすることはエラーとなるのです。指定してもその要素が存在しませんから。

解決方法の例:append( )メソッドを使う

したがって、以下のコードは間違いになります。

fruits_list=['apple', 'orange', 'berry', ]
new_list=[]
for i in range(0,3):
    new_list[i] = fruits_list[i]

new_list[0]という要素を指定しても、それがそもそも存在していないからです。

逆にいえば、空のリストのnew_listについては「要素を指定しなければ良い」ということになります。

そこで、new_listにappend()メソッドを使って「要素を指定してなにかをするのではなく、空のリストそのものに変更を加える」ことを考えます。

fruits_list=['apple', 'orange', 'berry', ]
new_list=[]
for i in range(0,3):
    new_list.append( fruits_list[i] )
print(new_list)  # 結果:['apple', 'orange', 'berry']

上のように空のリストに要素を加えて、「空ではないリスト」にしてから、そのリストの要素を指定してからその後に、

new_list[0] = 'melon'

とすると上手くいきます。