Суть этой ошибки очень проста – попытка обратиться к элементу списка/массива с несуществующим индексом.
Пример:
lst = [1, 2, 3]
print(lst[3])
вывод:
----> 2 print(lst[3])
IndexError: list index out of range
Указанный в примере список имеет три элемента. Индексация в Python начинается с 0
и заканчивается n-1
, где n
– число элементов списка (AKA длина списка).
Соответственно для списка lst
валидными индексами являются: 0
, 1
и 2
.
В Python также имеется возможность индексации от конца списка. В этом случае используются отрицательные индексы: -1
– последний элемент, -2
– второй с конца элемент, …, -n-1
– второй с начала, -n
– первый с начала.
Т.е. если указать отрицательный индекс, значение которого превышает длину списка мы получим всё ту же ошибку:
In [2]: lst[-4]
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
<ipython-input-2-ad46a138c96e> in <module>
----> 1 lst[-4]
IndexError: list index out of range
В реальной жизни (коде) эта ошибку чаще всего возникает в следующих ситуациях:
- если список пустой:
lst = []; first = lst[0]
- в циклах – когда переменная итерирования (по индексам) дополнительно изменяется или когда используются глобальные переменные
- в циклах при использовании вложенных списков – когда перепутаны индексы строк и столбцов
- в циклах при использовании вложенных списков – когда размерности вложенных списков неодинаковые и код этого не учитывает. Пример:
data = [[1,2,3], [4,5], [6,7,8]]
– если попытаться обратиться к элементу с индексом2
во втором списке ([4,5]
) мы получимIndexError
- в циклах – при изменении длины списка в момент итерирования по нему. Классический пример – попытка удаления элементов списка при итерировании по нему.
Поиск и устранения ошибки начинать нужно всегда с того, чтобы внимательно прочитать сообщение об ошибке (error traceback
).
Пример скрипта (test.py
), в котором переменная итерирования цикла for <variable>
изменяется (так делать нельзя):
lst = [1,2,3]
res = []
for i in range(len(lst)):
i += 1 # <--- НЕ ИЗМЕНЯЙТЕ переменную итерирования!
res.append(lst[i] ** 2)
Ошибка:
Traceback (most recent call last):
File "test.py", line 6, in <module>
res.append(lst[i] ** 2)
IndexError: list index out of range
Обратите внимание что в сообщении об ошибке указан номер ошибочной строки кода – File "test.py", line 6
и сама строка, вызвавшая ошибку: res.append(lst[i] ** 2)
. Опять же в реальном коде ошибка часто возникает в функциях, которые вызываются из других функций/модулей/классов. Python покажет в сообщении об ошибке весь стек вызовов – это здорово помогает при отладке кода в больших проектах.
После этого – мы точно знаем в каком месте кода возникает ошибка и можем добавить в код отладочную информацию, например напечатать значения индекса, который вызвал ошибку, понять почему используется неправильный индекс и исправить ошибку.
У меня есть следующий список:
expected_ans = [[3], [1],[2],[1,2,3],[1,3],[2,3], [1,2] ,[]]
Я пытаюсь упорядочить его элементы по первому элементу в подсписке следующим образом:
sorted(expected_ans, key=lambda x:x[-1])
Я получаю следующую ошибку:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in <lambda>
IndexError: list index out of range
Я не уверен, что мне не хватает? Заранее благодарим за предложения.
2020-04-11 02:24
2
ответа
Решение
Никакой индекс не будет работать с пустым списком, которым является последний подсписок в вашем списке примеров.
Вместо этого вы можете отсортировать по одному элементу каждого подсписка, который, в случае пустого подсписка, вернет пустой список в качестве ключа и поместит его перед возвращаемым списком:
sorted(expected_ans, key=lambda x: x[-1:])
Это возвращает:
[[], [1], [2], [1, 2], [3], [1, 2, 3], [1, 3], [2, 3]]
2020-04-11 02:30
Прежде всего, вы сортируете по последнему элементу в каждом списке
Во-вторых, вы видите ошибку индекса потому, что последний список пуст. [ ][-1] вызовет IndexError, потому что нет элемента в позиции -1.
2020-04-11 02:27
Автор оригинала: Chris.
Если вы похожи на меня, вы сначала попробуйте все в своем коде и исправить ошибки, как они приходят. Одна частая ошибка в Python – IndexError: Индекс списка вне диапазона
Отказ Итак, что означает это сообщение об ошибке?
Ошибка ” Индекс списка вне диапазона «Возникает, если вы получаете доступ к недействительным индексам в вашем списке Python. Например, если вы пытаетесь получить доступ к элементу списка с индексом 100, но ваши списки состоят только из трех элементов, Python будет бросать indexError, рассказывая о том, что индекс списка не имеет диапазона Отказ
Вы хотите развивать навыки Хорошо округлый Python Professional То же оплачивается в процессе? Станьте питоном фрилансером и закажите свою книгу Оставляя крысиную гонку с Python На Amazon ( Kindle/Print )!
Давайте посмотрим на пример, где возникает эта ошибка:
lst = ['Alice', 'Bob', 'Carl'] print(lst[3])
Элемент с индексом 3 не существует в списке с тремя элементами. Это почему? Следующий график показывает, что максимальный индекс в вашем списке – 2. Вызов lst [2]
потратил бы Третий Список элементов «Карл»
Отказ Вы пытались получить доступ к третьему элементу с индексом 3? Это распространенная ошибка: индекс третьего элемента – 2, потому что индекс элемента первого списка составляет 0.
- lst [0] -> Алиса
- lst [1] -> Боб
- lst [2] -> Карл
- lst [3] -> ??? Ошибка ???
Попробуйте сами: Прежде чем я скажу вам, что делать с этим, попробуйте исправить код себя в нашей интерактивной оболочке Python:
Упражнение : Исправьте код в оболочке интерактивного кода, чтобы избавиться от сообщения об ошибке.
Итак, как вы можете исправить код? Python говорит вам, в какой строке и в каком списке возникает ошибка.
Чтобы прикрепить точную проблему, проверьте значение индекса непосредственно перед возникновением ошибки. Для достижения этого вы можете распечатать индекс, который вызывает ошибку, прежде чем использовать ее в списке. Таким образом, у вас будет неправильный индекс в оболочке прямо перед сообщением об ошибке.
Вот пример неправильного кода, который приведет к появлению ошибки:
# WRONG CODE lst = ['Alice', 'Bob', 'Ann', 'Carl'] for i in range(len(lst)+1): lst[i] # Traceback (most recent call last): # File "C:UsersxcentDesktopcode.py", line 5, in # lst[i] # IndexError: list index out of range
Сообщение об ошибке сообщает вам, что ошибка появляется в строке 5. Итак, давайте вставьте оператор печати до этой строки:
lst = ['Alice', 'Bob', 'Ann', 'Carl'] for i in range(len(lst)+1): print(i) lst[i]
Результатом этого кода-фрагмента по-прежнему ошибка. Но есть еще:
0 1 2 3 4 Traceback (most recent call last): File "C:UsersxcentDesktopcode.py", line 6, in lst[i] IndexError: list index out of range
Теперь вы можете увидеть все индексы, используемые для извлечения элемента. Последний – это индекс I = 4
Какие указывает на пятый элемент в списке (помните: Python начинает индексирование при индексе 0! ). Но в списке есть только четыре элемента, поэтому вам нужно уменьшить количество индексов, которые вы итерацииете. Правильный код, следовательно:
# CORRECT CODE lst = ['Alice', 'Bob', 'Ann', 'Carl'] for i in range(len(lst)): lst[i]
Обратите внимание, что это минимальный пример, и это не имеет большого смысла. Но общая стратегия отладки остается даже для продвинутых проектов кода:
- Выясните неисправный индекс непосредственно перед броском.
- Устранить источник неисправного индекса.
IndexError при изменении списка по мере того, как вы повторяете его
IdmandError также часто происходит, если вы повторяете список, но вы удалите элементы, как вы итерации по списку:
l=[1,2,3,0,0,1] for i in range(0, len(l)): if l[i]==0: l.pop(i)
Этот фрагмент кода от A Stackoverflow вопрос. Источник просто то, что list.pop () Метод Удаляет элемент со значением 0. Все последующие элементы теперь имеют меньший индекс. Но вы идете за все индексы до Лен (л) -1-1
и индекс 5 не существует в списке после удаления элементов в предыдущей итерации.
Вы можете просто исправить это с помощью оператора понимания короткого списка, который выполняет то же самое:
Только ненулевые элементы включены в список.
String indexError: Индекс списка вне диапазона
Ошибка может возникнуть при доступе к строкам:
Чтобы исправить ошибку для строк, убедитесь, что индекс падает между диапазоном 0 ... ЛЕН (S) -1
(Включено):
s = 'Python' print(s[5]) # n
Tuple indexError: Индекс списка вне диапазона
На самом деле, indexError может возникнуть для всех упорядоченных коллекций, где вы можете использовать индексацию для получения определенных элементов. Таким образом, это также происходит при доступе к индексам кортежей, которые не существуют:
s = ('Alice', 'Bob') print(s[2])
Опять же, начните считать с индексом 0, чтобы избавиться от этого:
s = ('Alice', 'Bob') print(s[1]) # Bob
Примечание : Индекс последнего элемента в любой последовательности Лен (последовательность) -1 .
Куда пойти отсюда?
Достаточно теории, давайте познакомимся!
Чтобы стать успешным в кодировке, вам нужно выйти туда и решать реальные проблемы для реальных людей. Вот как вы можете легко стать шестифункциональным тренером. И вот как вы польские навыки, которые вам действительно нужны на практике. В конце концов, что такое использование теории обучения, что никто никогда не нуждается?
Практические проекты – это то, как вы обостряете вашу пилу в кодировке!
Вы хотите стать мастером кода, сосредоточившись на практических кодовых проектах, которые фактически зарабатывают вам деньги и решают проблемы для людей?
Затем станьте питоном независимым разработчиком! Это лучший способ приближения к задаче улучшения ваших навыков Python – даже если вы являетесь полным новичком.
Присоединяйтесь к моему бесплатным вебинаре «Как создать свой навык высокого дохода Python» и посмотреть, как я вырос на моем кодированном бизнесе в Интернете и как вы можете, слишком от комфорта вашего собственного дома.
Присоединяйтесь к свободному вебинару сейчас!
Работая в качестве исследователя в распределенных системах, доктор Кристиан Майер нашел свою любовь к учению студентов компьютерных наук.
Чтобы помочь студентам достичь более высоких уровней успеха Python, он основал сайт программирования образования Finxter.com Отказ Он автор популярной книги программирования Python One-listers (Nostarch 2020), Coauthor of Кофе-брейк Python Серия самооставленных книг, энтузиаста компьютерных наук, Фрилансера и владелец одного из лучших 10 крупнейших Питон блоги по всему миру.
Его страсти пишут, чтение и кодирование. Но его величайшая страсть состоит в том, чтобы служить стремлению кодер через Finxter и помогать им повысить свои навыки. Вы можете присоединиться к его бесплатной академии электронной почты здесь.
Ситуация: у нас есть проект, в котором мы математически моделируем игру в рулетку. Мы хотим обработать отдельно нечётные числа, которые есть на рулетке, — для этого нам нужно выбросить из списка все чётные. Проверка простая: если число делится на 2 без остатка — оно чётное и его можно удалить. Для этого пишем такой код:
# в рулетке — 36 чисел, не считая зеро
numbers = [n for n in range(36)]
# перебираем все числа по очереди
for i in range(len(numbers)):
# если текущее число делится на 2 без остатка
if numbers[i] % 2 == 0:
# то убираем его из списка
del numbers[i]
Но при запуске компьютер выдаёт ошибку:
❌ IndexError: list index out of range
Почему так произошло, ведь мы всё сделали правильно?
Что это значит: компьютер на старте цикла получает и запоминает одну длину списка с числами, а во время выполнения эта длина меняется. Компьютер, держа в памяти старую длину, пытается обратиться по номерам к тем элементам, которых уже нет в списке.
Когда встречается: когда программа одновременно использует список как основу для цикла и тут же в цикле добавляет или удаляет элементы списка.
В нашем примере случилось вот что:
- Мы объявили список из чисел от 1 до 36.
- Организовали цикл, который зависит от длины списка и на первом шаге получает его размер.
- Внутри цикла проверяем на чётность, и если чётное — удаляем число из списка.
- Фактический размер списка меняется, а цикл держит в голове старый размер, который больше.
- Когда мы по старой длине списка обращаемся к очередному элементу, то выясняется, что список закончился и обращаться уже не к чему.
- Компьютер останавливается и выводит ошибку.
Что делать с ошибкой IndexError: list index out of range
Основное правило такое: не нужно в цикле изменять элементы списка, если список используется для организации этого же цикла.
Если нужно обработать список, то результаты можно складывать в новую переменную, например так:
# в рулетке — 36 чисел, не считая зеро
numbers = [n for n in range(36)]
# новый список для нечётных чисел
new_numbers = []
# перебираем все числа по очереди
for i in range(len(numbers)):
# если текущее число не делится на 2 без остатка
if numbers[i] % 2 != 0:
# то добавляем его в новый список
new_numbers.append(numbers[i])
Вёрстка:
Кирилл Климентьев
Задание с программы обучения Яндес.Практикум:
Необходимо вывести на экран список уникальных значений столбца interval.
КОД:
import pandas
data = pandas.read_csv('support_data.csv')
interval_new = []
interval = list(data('interval') # преобразуйте столбец interval в список
for index in data:
if index not in interval_new:
interval_new.append(index)
print (interval_new) # выведите полученный список на экран
При запуске ошибка:
Traceback (most recent call last):
File "main.py", line 7
for index in data:
^
SyntaxError: invalid syntax
-
Вопрос задан19 сент. 2022
-
167 просмотров
у вас пробелы перед for index in data:
У тебя кривые отступы – лишние пробелы перед for
1.
interval = list(data('interval') # преобразуйте столбец interval в список
Не закрыта круглая скобка для list(
2. for index in data:
Что за дикий отступ? В питоне отступы значимы, к ним надо относиться очень внимательно.
Пригласить эксперта
-
Показать ещё
Загружается…
21 мая 2023, в 17:53
150000 руб./за проект
21 мая 2023, в 17:17
10000 руб./за проект
21 мая 2023, в 17:15
4000 руб./за проект