// каталог ошибок · 12 сообщений

Ошибки данных в Python: IndexError, KeyError, ValueError, ZeroDivisionError

Код написан правильно, а данные подвели: индекса нет в списке, ключа нет в словаре, строку нельзя превратить в число, делитель оказался нулём. Такие ошибки чаще всего приходят от ввода пользователя и краевых случаев, которые не проверили заранее.

Свой трейсбек удобнее вставить в расшифровщик: он сам найдёт нужное сообщение и подставит имена из твоего кода в объяснение. Ниже — все сообщения семейства по порядку, у каждого постоянная ссылка.

Данные: IndexError, KeyError, ValueError, ZeroDivisionError 12

IndexError: list index out of range

индекс за пределами list

Запрошен элемент с номером, которого нет: в list меньше элементов, чем ты думаешь. Нумерация начинается с нуля, последний элемент это len(x) - 1.

частые причины

  • Цикл до len(x) включительно: range(len(x) + 1).
  • Обращение к x[len(x)] вместо x[-1].
  • Коллекция пустая: ввод не пришёл или список ещё не заполнен.
  • Строка ввода короче, чем ожидалось.

как починить

Проверь длину перед обращением и используй x[-1] для последнего элемента.

было

items = [1, 2, 3]
print(items[3])

стало

items = [1, 2, 3]
print(items[-1])

списки в справочнике

IndexError: pop from empty list

pop из пустого списка

pop() вызван у списка, в котором уже нет элементов.

частые причины

  • Цикл извлекает элементы дольше, чем их есть.

как починить

Проверяй if items: перед pop() или используй while items:.

списки в справочнике

IndexError

ошибка индекса

Обращение по номеру, которого в коллекции нет.

частые причины

  • Индекс больше длины минус один.
  • Пустая коллекция.

как починить

Сверь индекс с len(x).

списки в справочнике

KeyError: 'age'

ключ age не найден

В словаре нет ключа age. Python не подставляет значение по умолчанию, а сразу останавливается.

частые причины

  • Опечатка или другой регистр в ключе.
  • Ключ строка, а ищется число: d["1"] и d[1] разные ключи.
  • Ключ ещё не добавлен: счётчик не инициализирован.

как починить

Используй d.get(key, default) или проверь if key in d. Для счётчиков подойдёт collections.Counter или defaultdict.

было

counts = {}
counts["a"] += 1

стало

counts = {}
counts["a"] = counts.get("a", 0) + 1

словари в справочнике

ValueError: invalid literal for int() with base 10: 'abc'

строку «abc» нельзя превратить в целое число

int() получил строку abc, в которой не только цифры.

частые причины

  • Пустая строка: ввод закончился или строка пустая.
  • Дробное число: int("3.5") не работает, нужен float.
  • Пробелы, буквы или единицы измерения в строке.
  • Вся строка ввода вместо одного числа: int("3 4").

как починить

Убери лишнее до преобразования: int(text.strip()), int(float(text)), а для нескольких чисел разбей строку через split().

было

n = int("3.5")

стало

n = int(float("3.5"))

TypeError и ValueError в справочнике

ValueError: could not convert string to float: '3,5'

строку «3,5» нельзя превратить в дробное число

float() не разобрал строку 3,5.

частые причины

  • Запятая вместо точки: 3,5.
  • Пробелы или текст рядом с числом.

как починить

Замени запятую на точку: float(text.replace(",", ".")).

было

x = float("3,5")

стало

x = float("3,5".replace(",", "."))

TypeError и ValueError в справочнике

ValueError: not enough values to unpack (expected 2, got 1)

недостаточно значений для распаковки: ожидалось 2, получено 1

Слева от = 2 имени, а справа коллекция из 1 элементов.

частые причины

  • Строка ввода содержит меньше слов, чем ожидалось.
  • split по не тому разделителю.

как починить

Проверь ввод и разделитель. Если частей может быть меньше, разбирай список по индексам с проверкой длины.

было

a, b = "5".split()

стало

a, b = "5 7".split()

TypeError и ValueError в справочнике

ValueError: too many values to unpack (expected 2)

слишком много значений для распаковки: ожидалось 2

Слева от = 2 имени, а справа элементов больше.

частые причины

  • В строке ввода больше слов, чем переменных.
  • Распаковка строки по символам вместо списка.

как починить

Добавь имя со звёздочкой для остатка: first, *rest = items.

было

a, b = [1, 2, 3]

стало

a, b, *rest = [1, 2, 3]

TypeError и ValueError в справочнике

ValueError: 5 is not in list

значения нет в списке

index() или remove() не нашли элемент в списке.

частые причины

  • Элемент уже удалён или его там не было.
  • Тип не совпадает: ищется "5", а лежит 5.

как починить

Проверь if x in items перед index и remove.

списки в справочнике

ValueError: substring not found

подстрока не найдена

str.index() не нашёл подстроку и остановил программу.

частые причины

  • Подстроки действительно нет в тексте.

как починить

Используй find(), который возвращает -1, или проверь if part in text.

было

pos = text.index("@")

стало

pos = text.find("@")
if pos == -1:
    print("нет @")

методы строк в справочнике

ValueError

ошибка значения

Тип подходит, а само значение нет: функция не может с ним работать.

частые причины

  • Строка не того формата для преобразования.
  • Число вне допустимого диапазона.

как починить

Проверь значение перед вызовом или оберни вызов в try/except ValueError.

TypeError и ValueError в справочнике

ZeroDivisionError: division by zero

деление на ноль

Делитель оказался нулём. Чаще всего это не ошибка арифметики, а пустые данные.

частые причины

  • Среднее по пустому списку: sum(x) / len(x) при len(x) == 0.
  • Счётчик не увеличили в цикле.
  • Процент от нуля.

как починить

Проверь делитель до деления: avg = sum(x) / len(x) if x else 0.

было

avg = sum(scores) / len(scores)

стало

avg = sum(scores) / len(scores) if scores else 0

try/except в справочнике

Как искать причину

  1. IndexError: напечатай len(x) и индекс перед обращением. Нумерация начинается с нуля, поэтому range(len(x)) уже доходит до последнего элемента, а x[len(x)] всегда за границей.
  2. KeyError: проверь ключ через in или возьми dict.get(key, default). Ключи 1 и "1" разные, как и "Москва" с пробелом на конце и без.
  3. ValueError при int() и float(): очисти строку через strip(), замени запятую на точку, проверь пустой ввод. Само сообщение показывает точное значение, которое не удалось преобразовать.
  4. ZeroDivisionError: проверяй делитель заранее. Чаще всего ноль приходит из среднего по пустому списку или из счётчика, который никогда не увеличился.

Как читать трейсбек

  1. Читай снизу вверх: последняя строка называет ошибку и объясняет её текстом.
  2. Строка выше с File "...", line N показывает, где Python остановился. Для SyntaxError причина часто на строке выше указанной.
  3. Стрелка ^ под кодом отмечает место, где разбор сломался.

Дальше