HOWTO · Python
IndexError: Python の範囲外のタプル インデックス
Python で範囲外のタプル インデックス エラーを解決する方法を示します。
このページの内容
タプルのインデックスエラーは、タプルに存在しない位置の要素を Python が取得しようとしたときに発生します。この記事では、インデックスの仕組み、最後の要素の取得方法、変化するデータに応じたインデックスの扱い方を説明します。
IndexError: tuple index out of range の意味
タプルは順序を持つ変更不可のコレクションです。Python では要素のインデックスは 0 から始まるため、要素数が n 個のタプルで有効な正のインデックスは 0 から n - 1 までです。たとえば、7 個の要素を持つタプルの最後の要素はインデックス 7 ではなく 6 にあります。インデックス 7 を読み取ろうとすると、IndexError: tuple index out of range が発生します。
負のインデックスは末尾から数えます。-1 は最後の要素、-2 はそのひとつ前の要素を指します。空のタプルには要素がないため、正負どちらのインデックスでも要素を取得できません。
エラーのよくある原因
最もよくある原因は、タプルの長さをそのままインデックスに使うなど、境界を 1 つ超える計算です。items の要素数が 4 個なら、len(items) は 4 ですが、最後の正のインデックスは 3 です。range(len(items)) を使うループは、通常のインデックス指定であれば安全です。最後の値が長さより 1 小さいためです。手作業で 1 を足すと、範囲を超えることがあります。
インデックスは入力値、計算結果、または処理の途中で変わるデータから得られることもあります。エラーが起きたアクセスで実際に使われた値と、その時点でのタプルの長さを確認してください。値の型が異なることだけでは、このタプル固有のメッセージが発生した理由にはなりません。トレースバックや変数名が誤解を招く場合は、実際にインデックス指定の対象になっているオブジェクトを確認します。
タプルの最後の要素を安全に取得する
要素が 1 つ以上あるタプルなら、最後の要素を取得する簡潔な方法は items[-1] です。ほかの処理でも長さが必要な場合は、items[len(items) - 1] でも同じ位置を選べます。どちらの方法も、タプルに少なくとも 1 つの要素があることが前提です。
次の例を実行すると、最後の要素として blue が表示されます。コード内の文字列と表示されるラベルは英語のままです。
items = ("red", "green", "blue")
print(items[-1])
出力: blue
blue
タプルが空の場合もあるなら、インデックスを指定する前に確認します。
items = ()
if items:
print(items[-1])
else:
print("No items")
出力: No items
No items
この例では、要素がないときに No items と表示します。この表示ラベルは英語のままです。成功しないアクセスを試みずに、要素がない場合を明示的に処理できます。
範囲外になる可能性があるインデックスを扱う
インデックスがタプルの範囲内にある想定でも、アクセス前に検証してください。範囲外の場合に既定値を選んだり、要求された位置に要素がないことを伝えたりしやすくなります。
このセクションのコードと表示されるラベルや出力は英語のままです。
items = ("red", "green", "blue")
index = 4
if 0 <= index < len(items):
print(items[index])
else:
print("Index is outside the tuple")
出力: Index is outside the tuple
Index is outside the tuple
この例では、インデックスが範囲外のときに Index is outside the tuple と表示します。この表示ラベルは英語のままです。
範囲チェックは、位置が使えないときにプログラムで特定の対応を行う必要がある場合に便利です。インデックスが正当に変わり得る処理で、事前に確認するよりアクセス時の失敗を処理するほうが明確なら、IndexError を捕捉します。try ブロックはそのアクセスだけに絞ってください。広範囲な例外処理は、関係のないプログラム上のエラーを隠すことがあります。空のタプルには、正のインデックスの範囲チェックを通るインデックスはありません。
インデックス指定の前に値とインデックスを確認する
オブジェクトの型が不明な場合は、まず isinstance(value, tuple) でタプルかどうかを確認します。この確認で分かるのはオブジェクトの型であり、特定のインデックスに要素が存在するかどうかではありません。その後、インデックスを len(value) と照らし合わせるか、アクセス時に IndexError を処理します。別のシーケンス型であれば、その型で想定される動作を調べ、このタプル固有のメッセージの原因だと決めつけないでください。
要するに、IndexError はタプルに存在する位置を超えて要素を取得しようとしたことを示します。境界を 1 つ超える計算を修正し、要素が空でないタプルの最後の要素には items[-1] を使います。インデックスがデータに応じて変わる場合は、明示的な範囲チェックか、対象を絞った例外処理を選びます。