Цикл Python: индекс списка вне диапазона
учитывая следующий список
a = [0, 1, 2, 3]
Я хотел бы создать новый список b, которая состоит из элементов, для которых текущее и следующее значение a суммируются. Он будет содержать 1 меньше, чем элемент a.
такой:
b = [1, 3, 5]
(от 0+1, 1+2 и 2+3)
вот что я пробовал:
b = []
for i in a:
b.append(a[i + 1] - a[i])
b
проблема в том, что я продолжаю получать эту ошибку:
IndexError: list index out of range
Я уверен, что это происходит потому что к тому времени, когда я получаю последний элемент a (3), я не могу добавить его ни к чему, потому что это выходит за пределы его значения (после 3 нет значения для добавления). Поэтому мне нужно сказать коду остановиться на 2, все еще ссылаясь на 3 для расчета.
4 ответов
- в своем
forцикл, вы перебираете элементы спискаa. Но в теле цикла вы используете эти элементы для индексации этого списка, когда вам действительно нужны индексы.
Представьте, если списокaбудет содержать 5 элементов, число 100 будет среди них, и цикл for достигнет его. Вы по существу попытаетесь получить 100-й элемент спискаa, которого, очевидно,нет. Это даст вамIndexError.
мы можем исправить эту проблему, выполнив итерацию по диапазону индексов:
for i in range(len(a))
и к aтакие предметы: a[i]. Это не даст никаких ошибок.
- в теле цикла, вы индексируете не только
a[i], но иa[i+1]. Это также место для потенциальной ошибки. Если ваш список содержит 5 элементов, и вы повторяете его, как я показал в пункте 1, вы получитеIndexError. Почему? Потому чтоrange(5)is по существу0 1 2 3 4, поэтому, когда цикл достигнет 4, вы попытаетесь получитьa[5]товар. Поскольку индексирование в Python начинается с 0, а ваш список содержит 5 элементов, последний элемент будет иметь индекс 4, поэтому получениеa[5]означало бы получить шестой элемент, которого не существует.
чтобы исправить это, вы должны вычесть 1 из len(a) для того чтобы получить последовательность диапазоне 0 1 2 3. Поскольку вы используете index i+1, вы все равно получите последний элемент, но этот путь вы избежите ошибки.
- есть много разных способов выполнить то, что вы пытаетесь сделать здесь. Некоторые из них довольно элегантный и более "подходящие для Python", как и списочные включения:
b = [a[i] + a[i+1] for i in range(len(a) - 1)]
это делает работу только в одной строке.
когда вы называете for i in a:, вы получаете фактические элементы, а не индексы. Когда мы достигаем последнего элемента, то есть 3, b.append(a[i+1]-a[i]) ищет a[4], не находит один, а затем терпит неудачу. Вместо этого попробуйте выполнить итерацию по индексам, остановившись на последнем, например
for i in range(0, len(a)-1): Do something
ваш текущий код еще не будет работать для части do something;)
вы получаете доступ к элементам списка, а затем используете их для попытки индексирования списка. Это плохая идея. У вас уже есть ответ, показывающий, как вы можете использовать индексирование для получения списка сумм, но другой вариант -zip список с кусочком себя таким, что вы можете суммировать пары.
b = [i + j for i, j in zip(a, a[1:])]
попробуйте уменьшить диапазон цикла for до range(len(a)-1):
a = [0,1,2,3]
b = []
for i in range(len(a)-1):
b.append(a[i]+a[i+1])
print(b)
Это также может быть записано как понимание:
b = [a[i] + a[i+1] for i in range(len(a)-1)]
print(b)