Python Loop: Índice de lista fuera de rango

Dada la siguiente lista

a = [0, 1, 2, 3] 

Me gustaría crear una nueva lista b , que consiste en elementos para los cuales se sumn el valor actual y el siguiente de a . Contendrá 1 elemento menos que a .

Me gusta esto:

 b = [1, 3, 5] 

(de 0 + 1, 1 + 2, y 2 + 3)

Esto es lo que he intentado:

 b = [] for i in a: b.append(a[i + 1] - a[i]) b 

El problema es que sigo recibiendo este error:

 IndexError: list index out of range 

Estoy bastante seguro de que ocurre porque cuando recibo el último elemento de un (3), no puedo agregarlo a nada porque hacerlo está fuera del valor de este (no hay ningún valor después de 3 para agregar). ). Así que necesito decirle al código que pare en 2 mientras sigo refiriéndome a 3 para el cálculo.

  1. En su bucle for , está iterando a través de los elementos de una lista a . Pero en el cuerpo del bucle, estás usando esos elementos para indexar esa lista, cuando realmente quieres índices.
    Imagínese si la lista a contuviera 5 elementos, un número 100 estaría entre ellos y el bucle for lo alcanzaría. Básicamente intentará recuperar el elemento número 100 de la lista a , que obviamente no está allí. Esto le dará un IndexError .

Podemos solucionar este problema iterando sobre un rango de índices en su lugar:

 for i in range(len(a)) 

y accede a los ítems de a ‘s así: a[i] . Esto no dará ningún error.

  1. En el cuerpo del bucle, está indexando no solo a[i] , sino también a[i+1] . Este es también un lugar para un error potencial. Si su lista contiene 5 elementos y está iterando sobre ella como se muestra en el punto 1, obtendrá un IndexError . ¿Por qué? Debido a que el range(5) es esencialmente 0 1 2 3 4 , cuando el bucle llegue a 4, intentará obtener el elemento a[5] . Dado que la indexación en Python comienza con 0 y su lista contiene 5 elementos, el último elemento tendría un índice 4, por lo que obtener a[5] significaría obtener el sexto elemento que no existe.

Para solucionarlo, debes restar 1 de len(a) para obtener una secuencia de rango 0 1 2 3 . Como está utilizando un índice i+1 , seguirá obteniendo el último elemento, pero de esta forma evitará el error.

  1. Hay muchas maneras diferentes de lograr lo que estás tratando de hacer aquí. Algunos de ellos son bastante elegantes y más “pythonic”, como las listas de comprensión:

b = [a[i] + a[i+1] for i in range(len(a) - 1)]

Esto hace el trabajo en una sola línea.

Cuando llama for i in a: obtiene los elementos reales, no los índices. Cuando alcanzamos el último elemento, que es 3 , b.append(a[i+1]-a[i]) busca a[4] , no encuentra uno y luego falla. En su lugar, intente iterar sobre los índices mientras se detiene justo antes del último, como

for i in range(0, len(a)-1): Do something

Tu código actual no funcionará todavía para la parte de hacer algo;)

Está accediendo a los elementos de la lista y luego los está utilizando para intentar indexar su lista. Esta no es una buena idea. Ya tiene una respuesta que muestra cómo puede usar la indexación para obtener su lista de sums, pero otra opción sería zip la lista con una porción de sí misma de manera que pueda sumr los pares.

 b = [i + j for i, j in zip(a, a[1:])] 

Intente reducir el rango del bucle for al 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) 

Esto también se puede escribir como una lista de comprensión :

 b = [a[i] + a[i+1] for i in range(len(a)-1)] print(b)