Цикл 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)