it-swarm.com.de

Python Loop: List Index Out of Range

Angesichts der folgenden Liste

a = [0, 1, 2, 3]

Ich möchte eine neue Liste b erstellen, die aus Elementen besteht, für die der aktuelle und der nächste Wert von a summiert werden. Es enthält 1 weniger Elemente als a.

So was:

b = [1, 3, 5]

(von 0 + 1, 1 + 2 und 2 + 3)

Folgendes habe ich versucht:

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

Das Problem ist, dass ich immer wieder diesen Fehler erhalte:

IndexError: list index out of range

Ich bin mir ziemlich sicher, dass dies der Fall ist, da ich es zu dem Zeitpunkt, zu dem ich das letzte Element von a (3) erhalte, nicht zu irgendetwas hinzufügen kann, da dies außerhalb des Werts von a (es gibt keinen Wert nach 3, der hinzugefügt werden muss) liegt ). Deshalb muss ich den Code anweisen, bei 2 zu stoppen, während ich mich für die Berechnung immer noch auf 3 beziehe.

9
Dance Party2
  1. In Ihrer for -Schleife durchlaufen Sie die Elemente einer Liste a. Aber im Hauptteil der Schleife verwenden Sie diese Elemente, um diese Liste zu indizieren, wenn Sie tatsächlich Indizes möchten.
    Stellen Sie sich vor, die Liste a würde 5 Elemente enthalten, darunter eine Zahl 100, und die for-Schleife würde sie erreichen. Sie werden im Wesentlichen versuchen, das 100. Element der Liste a abzurufen, das offensichtlich nicht vorhanden ist. Dies gibt Ihnen ein IndexError.

Wir können dieses Problem beheben, indem wir stattdessen eine Reihe von Indizes durchlaufen:

for i in range(len(a))

und greifen Sie auf die Elemente von a zu: a[i]. Dies wird keine Fehler geben.

  1. Im Hauptteil der Schleife indizieren Sie nicht nur a[i], Sondern auch a[i+1]. Dies ist auch ein Ort für einen möglichen Fehler. Wenn Ihre Liste 5 Elemente enthält und Sie darüber iterieren, wie ich es in Punkt 1 gezeigt habe, erhalten Sie ein IndexError. Warum? Da range(5) im Wesentlichen 0 1 2 3 4 Ist, werden Sie versuchen, das Element a[5] Zu erhalten, wenn die Schleife 4 erreicht. Da die Indizierung in Python beginnt mit 0 und Ihre Liste enthält 5 Elemente, würde das letzte Element einen Index 4 haben, also würde das Erhalten des a[5] Bedeuten, das sechste Element zu erhalten, was nicht der Fall ist existieren.

Um dies zu beheben, müssen Sie 1 von len(a) subtrahieren, um eine Bereichssequenz 0 1 2 3 Zu erhalten. Da Sie einen Index i+1 Verwenden, erhalten Sie immer noch das letzte Element, aber auf diese Weise vermeiden Sie den Fehler.

  1. Es gibt viele verschiedene Möglichkeiten, um das zu erreichen, was Sie hier versuchen. Einige von ihnen sind recht elegant und "pythonisch", wie Listenverständnisse:

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

Dies erledigt die Arbeit in nur einer Zeile.

14
illright

Wenn Sie for i in a: Aufrufen, erhalten Sie die tatsächlichen Elemente, nicht die Indizes. Wenn wir das letzte Element erreichen, also 3, Sucht b.append(a[i+1]-a[i]) nach a[4], Findet kein Element und schlägt dann fehl. Versuchen Sie stattdessen, die Indizes zu durchlaufen, während Sie nur kurz vor dem letzten anhalten, z

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

Dein aktueller Code funktioniert aber noch nicht für den Teil "do something";)

2
Everyone_Else

Versuchen Sie, den Bereich der for-Schleife auf range(len(a)-1) zu reduzieren:

a = [0,1,2,3]
b = []

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

print(b)

Dies kann auch als Listenverständnis geschrieben werden:

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

Sie greifen auf die Listenelemente zu und versuchen dann, Ihre Liste zu indizieren. Das ist keine gute Idee. Sie haben bereits eine Antwort, die zeigt, wie Sie die Indexierung verwenden können, um Ihre Summenliste zu erhalten. Eine andere Option wäre jedoch, Zip die Liste mit einem Stück von sich selbst zu versehen, sodass Sie die Paare summieren können .

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