Цикл 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 ответов


  1. в своем for цикл, вы перебираете элементы списка a. Но в теле цикла вы используете эти элементы для индексации этого списка, когда вам действительно нужны индексы.
    Представьте, если список a будет содержать 5 элементов, число 100 будет среди них, и цикл for достигнет его. Вы по существу попытаетесь получить 100-й элемент списка a, которого, очевидно,нет. Это даст вам IndexError.

мы можем исправить эту проблему, выполнив итерацию по диапазону индексов:

for i in range(len(a))

и к aтакие предметы: a[i]. Это не даст никаких ошибок.

  1. в теле цикла, вы индексируете не только 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, вы все равно получите последний элемент, но этот путь вы избежите ошибки.

  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)