Pythonの「IndexError: tuple index out of range」エラーの原因と解決策を徹底解説
Pythonのタプル(tuple)はリストと同じようにインデックスが割り当てられており、各要素にはアクセス用の番号が付与されています。しかし、存在しない要素にアクセスしようとすると、Pythonは「tuple index out of range(タプルインデックスが範囲外です)」というエラーを返します。
本記事では、この頻出のPythonエラーの意味と発生理由を解説し、実際のコード例をもとに解決方法をわかりやすく紹介します。
エラーの原因:IndexError: tuple index out of rangeとは
タプルのインデックスは0から始まります。以降の要素には、直前の要素より1つ大きい番号が順に割り当てられます。次のタプルを見てみましょう。
birds = ("Robin", "Collared Dove", "Great Tit", "Goldfinch", "Chaffinch")
このタプルには5つの値が含まれており、それぞれに対応するインデックス番号は以下の通りです。
| Robin | Collared Dove | Great Tit | Goldfinch | Chaffinch |
| 0 | 1 | 2 | 3 | 4 |
タプルから「Robin」を取り出すには、次のように書きます。
print(birds[0])
実行結果は「Robin」となり、コンソールに出力されます。同様に、他のどの要素にもインデックスを使ってアクセスできます。
一方、タプルの範囲外にある要素にアクセスしようとすると、エラーが発生します。
エラーが発生する具体例
ここで、タプルの末尾3つの要素を出力するプログラムを作成してみましょう。まず、イギリスの鳥の名前を格納したタプルを宣言します。
birds = ("Robin", "Collared Dove", "Great Tit", "Goldfinch", "Chaffinch")
続いて、forループとrange()関数を使って、末尾3つの要素を出力します。range()は指定した範囲内の数値を生成するため、その範囲のインデックス番号を持つ要素を順番に処理できます。
for i in range(3, 6): print(birds[i])
このコードを実行すると、次のような結果になります。
Goldfinch Chaffinch Traceback (most recent call last): File "main.py", line 4, in <module> print(birds[i]) IndexError: tuple index out of range
「Goldfinch」と「Chaffinch」の2つの値は出力されましたが、3つ目の値を出力する前にエラーが発生してしまいました。
解決策
問題の原因はrange(3, 6)にあります。このrangeは3以上6未満の数値、つまり「3, 4, 5」を生成します。ところが、このタプルのインデックスは0〜4までしか存在しないため、ループが5番目のインデックスにアクセスしようとした時点でエラーが発生するのです。
試しにbirds[5]を単独で出力してみると、同じエラーが再現します。
print(birds[5])
実行結果:
Traceback (most recent call last): File "main.py", line 3, in <module> print(birds[5]) IndexError: tuple index out of range
このエラーの根本的な原因は、要素が1から始まるインデックスで管理されていると誤解していることにあります。タプルのインデックスは0から始まるのです。
このエラーを解決するには、range()の指定を見直し、タプルの末尾3つの要素だけを出力するようにします。範囲は2から5までとしましょう。
for i in range(2, 5): print(birds[i])
修正後のコードを実行すると、次のようになります。
Great Tit Goldfinch Chaffinch
今度はタプルの末尾3つの要素が正しく出力されました。インデックス2、3、4の要素にアクセスしており、これらはすべて有効な位置なので、コードは正常に動作します。
まとめ
「IndexError: tuple index out of range」は、タプルに存在しない要素へアクセスしようとした際に発生するエラーです。この問題を防ぐには、タプルから要素を取得する際に、目的の要素が実際に存在することを必ず確認しましょう。
このエラーで最も多い原因は、「タプルのインデックスは0から始まる」という点を忘れてしまうことです。タプルから値を取り出すときは、必ず0から数える習慣をつけましょう。初心者のうちは違和感があるかもしれませんが、Pythonでのコーディングを重ねるうちに、0から数えることは自然と身につきます。
これであなたも、プロのようにこのPythonエラーを解決できるはずです!
-
Pythonでタプルの要素にアクセスする方法:インデックスとスライスの使い方を解説
Pythonのタプル(tuple)は、複数の値を順序付きで格納できるイミュータブル(変更不可)なデータ構造です。タプルの個々の要素にアクセスするには [] 演算子を使用します。また、タプルの一部を取り出したい場合は、スライス演算子を使うことで範囲指定が可能です。 タプルのインデックスによる要素へのアクセス タプルの要素にアクセスするには、タプルに対して [] 演算子を使います。正の整数を指定した場合、左側(先頭)から数えてその位置にある要素を取得します。一方、負の整数を指定した場合は、右側(末尾)から数えてその位置にある要素を取得します。インデックスは 0 から始まる点に注意してください。
-
Pythonで範囲外のスライスがエラーにならない理由とは?インデックス指定との違いを解説
はじめに:スライスとインデックスの挙動の違いPythonでは、シーケンス(リスト、文字列、タプルなど)に対して範囲外のスライスを指定してもエラーにはなりません。一方で、範囲外のインデックスで要素にアクセスすると IndexError が発生します。この違いは一見不思議に思えますが、両者の設計思想を理解すれば納得できるものです。なぜスライスはエラーにならないのかポイントは、インデックスは「単一の要素」を返すのに対し、スライスは「部分シーケンス」を返すという点にあります。インデックス指定:存在しない位置の要素を要求した場合、返せる「値」そのものが存在しないため、エラー(IndexError)を発生