MeWrite Docs

IndexError: list index out of range

Pythonでリストの範囲外インデックスにアクセスした場合のエラー

概要

IndexError: list index out of range は、リストの存在しないインデックスにアクセスしようとした場合に発生します。Stack Overflowで最も閲覧されているPythonエラーの1つです。

エラーメッセージ

IndexError: list index out of range
IndexError: string index out of range
IndexError: tuple index out of range

原因

1. インデックスがリストの長さ以上

1
2
my_list = [1, 2, 3]
print(my_list[3])  # IndexError: インデックスは0, 1, 2のみ有効

2. 空のリストにアクセス

1
2
empty_list = []
print(empty_list[0])  # IndexError

3. ループ中のインデックス操作

1
2
3
4
5
items = [1, 2, 3, 4, 5]
for i in range(len(items)):
    # ループ中に要素を削除するとインデックスがずれる
    if items[i] % 2 == 0:
        items.pop(i)  # IndexError の原因

4. 負のインデックスの誤用

1
2
my_list = [1, 2, 3]
print(my_list[-4])  # IndexError: -3までが有効

解決策

1. インデックスの範囲を確認

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
my_list = [1, 2, 3]

# 事前にチェック
if len(my_list) > 3:
    print(my_list[3])
else:
    print("インデックス3は存在しません")

# try-exceptで処理
try:
    print(my_list[3])
except IndexError:
    print("インデックスが範囲外です")

2. 安全なアクセス方法

1
2
3
4
5
6
7
8
9
# get風のヘルパー関数
def safe_get(lst, index, default=None):
    try:
        return lst[index]
    except IndexError:
        return default

my_list = [1, 2, 3]
print(safe_get(my_list, 5, "default"))  # "default"

3. ループでの安全な削除

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
# NG: ループ中に削除
items = [1, 2, 3, 4, 5]
for i in range(len(items)):
    if items[i] % 2 == 0:
        items.pop(i)  # インデックスがずれてエラー

# OK: リスト内包表記
items = [1, 2, 3, 4, 5]
items = [x for x in items if x % 2 != 0]

# OK: 逆順でループ
items = [1, 2, 3, 4, 5]
for i in range(len(items) - 1, -1, -1):
    if items[i] % 2 == 0:
        items.pop(i)

# OK: filter
items = [1, 2, 3, 4, 5]
items = list(filter(lambda x: x % 2 != 0, items))

4. 空リストのチェック

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
results = []

# NG
first = results[0]  # IndexError

# OK
first = results[0] if results else None

# OK
if results:
    first = results[0]
else:
    first = None

5. スライスを使用(エラーにならない)

1
2
3
4
5
6
7
8
my_list = [1, 2, 3]

# インデックスアクセス(エラー)
# my_list[10]  # IndexError

# スライス(エラーにならない)
print(my_list[10:])  # [](空リスト)
print(my_list[:10])  # [1, 2, 3]

6. enumerateを使用

1
2
3
4
5
6
7
8
9
items = ["a", "b", "c"]

# NG: rangeでアクセス
for i in range(5):
    print(items[i])  # IndexError

# OK: enumerateで安全にループ
for i, item in enumerate(items):
    print(f"{i}: {item}")

よくあるパターン

ファイル読み込み時

1
2
3
4
5
6
7
lines = open("file.txt").readlines()

# NG: ファイルが空の場合
first_line = lines[0]  # IndexError

# OK
first_line = lines[0] if lines else ""

split結果のアクセス

1
2
3
4
5
6
7
8
9
text = "hello"

# NG: 区切り文字がない場合
parts = text.split(",")
second = parts[1]  # IndexError

# OK
parts = text.split(",")
second = parts[1] if len(parts) > 1 else None

APIレスポンスの処理

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
import json

response = '{"items": []}'
data = json.loads(response)

# NG: itemsが空の場合
first_item = data["items"][0]  # IndexError

# OK
items = data.get("items", [])
first_item = items[0] if items else None

デバッグ方法

1
2
3
4
5
6
7
8
9
my_list = [1, 2, 3]
index = 5

# インデックスとリスト長を確認
print(f"Index: {index}, Length: {len(my_list)}")
print(f"Valid indices: 0 to {len(my_list) - 1}")

# アサーションで事前チェック
assert 0 <= index < len(my_list), f"Invalid index: {index}"

関連エラー

関連エラー

Python の他のエラー

最終更新: 2025-12-23