¿Por qué obtengo un IndexError (o TypeError, o simplemente resultados incorrectos) de "ar[i]" dentro de "for i in ar"?

Resuelto q-compute asked hace 6 años • 3 respuestas

Estoy intentando sumar los valores de una lista usando un forbucle. Este es mi código:

def sumAnArray(ar):
    theSum = 0
    for i in ar:
        theSum = theSum + ar[i]
    return theSum

Obtuve el siguiente error:

line 13, theSum = theSum + ar[i]
IndexError: list index out of range

Descubrí que lo que estoy tratando de hacer es aparentemente tan simple como sum(ar). Pero quiero entender: ¿por qué recibo esto IndexErrory cómo debo escribir el forbucle? ¿Cómo funciona realmente el bucle?


Para obtener una descripción técnica de cómo Python implementa forlos bucles y el protocolo iterador, consulte, por ejemplo, ¿Cómo funciona un bucle for de Python con iterable? .

q-compute avatar Aug 19 '18 23:08 q-compute
Aceptado

Al recorrer una lista, la forvariable (en este ejemplo i) representa el elemento actual de la lista .

Por ejemplo, dado ar = [1, 5, 10], itendrá los valores sucesivos 1y cada vez a través del bucle. Dado que la longitud de la lista es 3, el índice máximo permitido es 2. Por lo tanto, la segunda vez que se realiza el ciclo, cuando se genera an .510i == 5IndexError

El código debería ser así:

for i in ar:
    theSum = theSum + i

Para poder indexar en la lista, use a rangeen lugar de iterar directamente sobre la lista:

for i in range(len(ar)):
    theSum = theSum + ar[i]

De esta manera, i naturalmente toma todos los valores de índice válidos para ar.

Mr Alihoseiny avatar Aug 19 '2018 16:08 Mr Alihoseiny

El bucle for itera sobre los elementos de la matriz, no sobre sus índices .

Considere, por ejemplo, una lista : ar = [2, 4, 6]cuando se ejecuta un bucle como este for i in ar:, los valores sucesivos de iserán 2y . La primera vez que se realiza el ciclo funcionaría (ya que la última posición de la lista es 2, es igual a 6), pero la siguiente iteración fallaría (ya que no es válida).46ar[i]a[2]a[4]

Intente usar for index, value in enumerate(ar):, para obtener índices junto con los valores ; entonces theSum = theSum + ar[index]debería funcionar bien.

umluizlima avatar Aug 19 '2018 16:08 umluizlima