web-dev-qa-db-fra.com

Python Loop: Index de liste hors limites

Compte tenu de la liste suivante

a = [0, 1, 2, 3]

J'aimerais créer une nouvelle liste b, composée d'éléments pour lesquels la valeur actuelle et la valeur suivante de a sont additionnées. Il contiendra 1 moins d'élément que a.

Comme ça:

b = [1, 3, 5]

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

Voici ce que j'ai essayé:

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

Le problème est que je continue à avoir cette erreur:

IndexError: list index out of range

Je suis presque sûr que cela se produit car, au moment où j'obtiens le dernier élément d'un (3), je ne peux pas l'ajouter à quoi que ce soit, car cela sort de sa valeur (il n'y a pas de valeur après 3 à ajouter ). Je dois donc dire au code de s’arrêter à 2 tout en faisant référence à 3 pour le calcul.

9
Dance Party2
  1. Dans votre boucle for, vous parcourez les éléments d'une liste a. Mais dans le corps de la boucle, vous utilisez ces éléments pour indexer cette liste, alors que vous voulez réellement des index.
    Imaginons que la liste a contienne 5 éléments, qu’un nombre 100 en fasse partie et que la boucle for l’atteigne. Vous allez essentiellement essayer de récupérer le 100ème élément de la liste a, qui n’est évidemment pas là. Cela vous donnera un IndexError.

Nous pouvons résoudre ce problème en effectuant une itération sur une plage d'index:

for i in range(len(a))

et accédez aux éléments de a comme ceci: a[i]. Cela ne donnera aucune erreur.

  1. Dans le corps de la boucle, vous indexez non seulement a[i], Mais aussi a[i+1]. C'est aussi un endroit pour une erreur potentielle. Si votre liste contient 5 éléments et que vous la parcourez comme indiqué au point 1, vous obtiendrez un IndexError. Pourquoi? Étant donné que range(5) est essentiellement 0 1 2 3 4, Lorsque la boucle atteint 4, vous essayez d'obtenir l'élément a[5]. Puisque l’indexation dans Python commence par 0 et que votre liste contient 5 éléments, le dernier élément aurait un index 4, donc obtenir le a[5] Signifierait obtenir le sixième élément qui ne exister.

Pour résoudre ce problème, vous devez soustraire 1 de len(a) afin d'obtenir une séquence de plage 0 1 2 3. Puisque vous utilisez un index i+1, Vous aurez toujours le dernier élément, mais vous éviterez ainsi l'erreur.

  1. Il existe de nombreuses façons d'accomplir ce que vous essayez de faire ici. Certains d'entre eux sont assez élégants et plus "pythoniques", comme les listes compréhensives:

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

Cela fait le travail en une seule ligne.

14
illright

Lorsque vous appelez for i in a:, Vous obtenez les éléments réels, pas les index. Lorsque nous atteignons le dernier élément, c'est-à-dire 3, b.append(a[i+1]-a[i]) cherche a[4], N'en trouve pas, puis échoue. Essayez plutôt de parcourir les index tout en vous arrêtant juste avant le dernier, comme

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

Votre code actuel ne fonctionnera pas encore pour la partie faire quelque chose cependant;)

2
Everyone_Else

Essayez de réduire la plage de la boucle 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)

Cela peut aussi être écrit comme un compréhension de la liste :

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

Vous accédez aux éléments de la liste, puis vous les utilisez pour tenter d’indexer votre liste. Ce n'est pas une bonne idée. Vous avez déjà une réponse montrant comment vous pouvez utiliser l'indexation pour obtenir votre liste de somme, mais une autre option serait de Zip la liste avec une tranche de soi telle que vous pouvez additionner les paires.

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