list index out of range ; list indices must be integers or slices, not 型名)

エラー詳細

Pythonのエラー

意味

(それぞれ別のエラーだけ似たようなもんなのでまとめて)

リストのインデックスが範囲を超えています。

リストのインデックスは整数もしくはスライス型でなければいけません。

原因

リストの要素にアクセスしようとしたときに、リストの長さ以上の数、もしくは整数やスライス以外のものを渡したときに出るエラー。

こんなことするとこのエラーがでる。

li = [1,2,3]
# 下記は全部エラー
print(li[4]) # 長さ超え
print(li[-4]) # 後ろから数えても長さ超えは☓
print(li["2"]) # 文字列型は自動変換されない

実はスライスだったら結構なんでも行ける。指定された範囲に入ってるものだけが返る。完全に範囲外だと空リストが返る。

li = [1,2,3]
# 下記4つは全部OK
print(li[0:999]) # [1,2,3]
print(li[-999:999]) # [1,2,3]
print(li[1:-999]) # []
print(li[9999:999]) # []

# さすがにこれはダメ
print(li["1":3]) # error:slice indices must be integers or None or have an __index__ method

エラー対処方法

まぁ、対処方法もなにもないが、基本はスクリプトを実行したときにリストの添字に長さ超えの数値や変なオブジェクトが渡らないようにコードを書く。・・・のが理想だけど、なかなかそれは難しいので、せめて整数以外のオブジェクトが渡らないようにだけ気をつけておいて

def get_element(index :int):
    li = [1,2,3] 
    if index >= len(li):
        # 長さ超えのときの処理
    else:
        return li[index]

こんな感じで対処することが多いかと。負の値やスライスが渡る可能性がある場合はそのためのコードも忘れずに。