list index out of range

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Vega
User
Beiträge: 28
Registriert: Sonntag 29. Januar 2017, 12:03

Hallo,

Habe folgenden Code:

Code: Alles auswählen

array = [3, 4, 2]
length = len(array)

for i in range(length, 0, -1):
    print(array[i])
bekomme dann folgenden Fehler:
IndexError: list index out of range

Kann mir da jemand weiter helfen?

Ich möchte die umgekehrt durchlaufen.

Danke im vorraus =)
karolus
User
Beiträge: 145
Registriert: Samstag 22. August 2009, 22:34

Code: Alles auswählen

…
for entry in reversed(array):
    print(entry)
Vega
User
Beiträge: 28
Registriert: Sonntag 29. Januar 2017, 12:03

Geht das auch ohne reversed?
Also z.B. mit range oder eben durch umdrehen der Liste?
BlackJack

@vega: Warum? Die Funktion ist genau dafür da. Und Indexzugriffe sind in Python unüblich, eben weil man das so gut wie immer ohne machen kann.
Vega
User
Beiträge: 28
Registriert: Sonntag 29. Januar 2017, 12:03

i soll mir die Position geben, an dem sich das Element in der Liste befindet.

Bei folgendem Code funktioniert es:

Code: Alles auswählen

array = [3, 4, 2]
length = len(array)

for i in range(0, length):
    print(array[i])
Nur, wenn ich über die Liste andersrum iterieren möchte funktioniert es nicht.
Benutzeravatar
bwbg
User
Beiträge: 407
Registriert: Mittwoch 23. Januar 2008, 13:35

Dafür gibt es die Funktion enumerate ;)
"Du bist der Messias! Und ich muss es wissen, denn ich bin schon einigen gefolgt!"
nezzcarth
User
Beiträge: 1778
Registriert: Samstag 16. April 2011, 12:47

Vega hat geschrieben: Nur, wenn ich über die Liste andersrum iterieren möchte funktioniert es nicht.
Möglicherweise wäre es sinnvoll, wenn du dir noch mal ansiehst, wie Indizes und die Range Funktion in Python funktionieren. Da die Indizes bei 0 beginnen kannst du natürlich nicht die Anzahl der Elemente als Startpunkt für's Rückwärtszählen nehmen.

Wie die anderen schon sagten, versucht man in Python aber nach Möglichkeit, nicht mit Indizes über Listen zu iterieren. Da gibt es bessere Möglichkeiten und wenn du anständiges Python programmieren möchtest, solltest du die auch verwenden.
BlackJack

@Vega: Zum iterieren der Liste, egal in welche Richtung brauchst Du kein `range()` und kein `i`. Wenn Du den Index *zusätzlich* benötigst, dann gibt es `enumerate()`. Aber wozu brauchst Du das `i` denn überhaupt? Solange Du keinen Code oder ein Problem zeigst wo man den Index tatsächlich benötigt, ist alles andere ausser ``reversed(array)`` einfach nur unnötig kompliziert.

Und selbst wenn man fortlaufende Zahlen eines Bereichs rückwärts benötigt, ist IMHO `reversed()` wesentlich lesbarer und verständlicher als ein `range()`-Objekt dafür direkt zu erstellen. An den Problemen die Du damit hast, sieht man ja warum das keine gute Idee ist. Das geht weder beim schreiben, noch beim Lesen so wirklich gut ohne ins stocken zu geraten.
Vega
User
Beiträge: 28
Registriert: Sonntag 29. Januar 2017, 12:03

Danke für die vielen Antworten.

Aber ich möchte die Liste von hinten durchlaufen und dabei mir die Position ausgeben.
Also als Beispiel, wenn ich folgende Liste habe: array = [5, 4, 10, 15, 3]
und ich durchlaufe die For-Schleife soll folgendes rauskommen (nehmen wir an, ich habe in der Schleife folgendes stehen: print(array)):
1. Durchlauf: 3
2. Durchlauf: 15
3. Durchlauf: 10
4. Durchlauf: 4
5. Durchlauf: 5

Und die Liste soll dabei nicht verändert werden, d.h. auch nicht mit reversed umdrehen. :)
Benutzeravatar
snafu
User
Beiträge: 6881
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Die Liste wird durch reversed() nicht verändert. reversed() liefert einfach einen Iterator, der die Elemente in umgekehrter Reihenfolge ausgibt. Das ist in Python die Lösung für dein Problem, auch wenn du es anscheinend nicht wahrhaben willst. Du kannst du auch leicht überprüfen:

Code: Alles auswählen

items = [5, 4, 10, 15, 3]
for item in reversed(items):
    print(item)
print(items)
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Und enumerate liefert noch den Index dazu:

Code: Alles auswählen

for i, item in reversed(items, start=1):
     ...
Vega
User
Beiträge: 28
Registriert: Sonntag 29. Januar 2017, 12:03

Ja, das verstehe ich und weiß ich auch aber mein Problem ist, dass ich dann für das letzte Element die Position 0 bekomme,
ich will jedoch die Liste von hinten durchlaufen und dabei aber die wirkliche Position des Elements in der Liste bekommen.

Beispiel:

array = [4, 2, 3]

Nun will ich das Element und die Position im array des Elements von hinten.
Also:
Für das Element 3 die Position 2
Für das Element 2 die Position 1
Für das Element 4 die Position 0
Benutzeravatar
snafu
User
Beiträge: 6881
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

In welchem Zusammenhang benötigst du den Index denn? Beschreibe mal dein echtes Vorhaben...
Vega
User
Beiträge: 28
Registriert: Sonntag 29. Januar 2017, 12:03

Ich möchte eine Liste durchlaufen, einmal von links nach rechts und einmal von rechts nach links.
Wenn ein bestimmter Fall eintritt möchte ich beide Elemente vertauschen.
nezzcarth
User
Beiträge: 1778
Registriert: Samstag 16. April 2011, 12:47

Vega hat geschrieben:Ich möchte eine Liste durchlaufen, einmal von links nach rechts und einmal von rechts nach links.
Wenn ein bestimmter Fall eintritt möchte ich beide Elemente vertauschen.
Das ist leider immer noch vage. Versuchst du einen Sortieralgorithmus oder so zu implementieren? Um so konkreter du wirst, um so besser kann man dir dabei helfen, dein Vorhaben in idiomatischem Python zu formulieren.

Für gleichzeitiges Durchlaufen der Liste auf verschiedene Weise kommt noch die 'zip' Funktion hinzu. Üblicherweise erzeugt man eine neue Liste, die mit den entsprechend ausgewählten Elementen befüllt wird, weshalb du evtl. trotzdem keine Indizes brauchst.

EDIT:
Für eine Liste mit einer geraden Anzahl an Elementen kann man dann z. B. soetwas machen:

Code: Alles auswählen

items = [4,2,3,1]

pivot = len(items) / 2
new_items = []
for i, elements in enumerate(zip(items, items[::-1])):
    first, second = elements
    if i < pivot:
        new_items.append(min(first, second))
    else:
        new_items.append(max(first, second))
Zuletzt geändert von nezzcarth am Samstag 8. April 2017, 14:24, insgesamt 3-mal geändert.
Benutzeravatar
snafu
User
Beiträge: 6881
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Code: Alles auswählen

range(len(items) - 1, -1, -1)
Alternativ:

Code: Alles auswählen

reversed(range(len(items)))
Vega
User
Beiträge: 28
Registriert: Sonntag 29. Januar 2017, 12:03

Daaaanke

Habe jetzt folgende Lösung gefunden:

Code: Alles auswählen

length = len(array)
t = len(array) - 1

for j in range(0, length):
    z = t - j
    if array[z] ....:
        ....
Ist zwar nicht ganz so schön, funktioniert aber :D
Benutzeravatar
snafu
User
Beiträge: 6881
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Funktionieren tut vieles. Man sollte aber nicht alles nur so programmieren, dass es läuft, sondern so, dass es läuft und gut lesbar ist. Sonst blickst du da irgendwann selbst nicht mehr durch. Python bietet viele Möglichkeit, um Code lesbarer zu gestalten. Man muss die Möglichkeiten nur kennen und richtig einsetzen.
Antworten