まず結論

IndexError は、リストにない番号を取り出そうとしたときに出ます。

items = ["りんご", "バナナ", "みかん"]
print(items[3])

このリストにある番号は、012 までです。

そのため、items[3] は取り出せません。

こんなときに読む記事です

次のようなエラーで止まった人向けです。

IndexError: list index out of range

意味は「リストの範囲にない番号を使っています」に近いです。

絵で見るなら

リストを、番号つきの棚として見ると分かりやすいです。

棚には 012 の場所があります。

でも 3 の場所はありません。

モコが 3 の番号札を持って棚を探しているけれど、棚がそこまで続いていないイメージです。

個数と番号はずれる

3個の値があるリストでも、最後の番号は 2 です。

0番目: りんご
1番目: バナナ
2番目: みかん

人間の感覚では「3個あるなら3まで」と思いやすいので、ここでつまずきます。

Pythonでは、最初を 0 として数えます。

番号を直す

最後の値を取りたいなら、今回は [2] を使います。

items = ["りんご", "バナナ", "みかん"]
print(items[2])

これで "みかん" が取り出せます。

len()と一緒に見る

len() はリストの個数を返します。

items = ["りんご", "バナナ", "みかん"]
print(len(items))

結果は 3 です。

ただし、最後の番号は 3 ではなく 2 です。

よくある勘違い

len(items)3 だからといって、items[3] が使えるわけではありません。

リストの番号は0から始まるため、最後の番号は「個数より1小さい」と考えます。

3個なら最後は2。
5個なら最後は4です。

読み方のコツ

IndexError が出たら、次のように見ます。

指定した番号は、リストの中にある?

リストの個数と、指定した番号を見比べると原因を見つけやすいです。

手を動かすミニ練習

[] の中の番号を変えて、どこまで取り出せるか確認しましょう。

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

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

次に items[3] へ変えると、範囲の外だと分かります。