Seite 1 von 1

list index out of range

Verfasst: Freitag 7. April 2017, 23:17
von Vega
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 =)

Re: list index out of range

Verfasst: Freitag 7. April 2017, 23:25
von karolus

Code: Alles auswählen

…
for entry in reversed(array):
    print(entry)

Re: list index out of range

Verfasst: Samstag 8. April 2017, 00:08
von Vega
Geht das auch ohne reversed?
Also z.B. mit range oder eben durch umdrehen der Liste?

Re: list index out of range

Verfasst: Samstag 8. April 2017, 00:13
von 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.

Re: list index out of range

Verfasst: Samstag 8. April 2017, 01:24
von Vega
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.

Re: list index out of range

Verfasst: Samstag 8. April 2017, 08:57
von bwbg
Dafür gibt es die Funktion enumerate ;)

Re: list index out of range

Verfasst: Samstag 8. April 2017, 10:36
von nezzcarth
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.

Re: list index out of range

Verfasst: Samstag 8. April 2017, 10:54
von 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.

Re: list index out of range

Verfasst: Samstag 8. April 2017, 12:36
von Vega
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. :)

Re: list index out of range

Verfasst: Samstag 8. April 2017, 12:40
von snafu
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)

Re: list index out of range

Verfasst: Samstag 8. April 2017, 12:57
von __deets__
Und enumerate liefert noch den Index dazu:

Code: Alles auswählen

for i, item in reversed(items, start=1):
     ...

Re: list index out of range

Verfasst: Samstag 8. April 2017, 13:12
von Vega
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

Re: list index out of range

Verfasst: Samstag 8. April 2017, 13:45
von snafu
In welchem Zusammenhang benötigst du den Index denn? Beschreibe mal dein echtes Vorhaben...

Re: list index out of range

Verfasst: Samstag 8. April 2017, 13:50
von Vega
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.

Re: list index out of range

Verfasst: Samstag 8. April 2017, 14:14
von nezzcarth
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))

Re: list index out of range

Verfasst: Samstag 8. April 2017, 14:16
von snafu

Code: Alles auswählen

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

Code: Alles auswählen

reversed(range(len(items)))

Re: list index out of range

Verfasst: Samstag 8. April 2017, 14:48
von Vega
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

Re: list index out of range

Verfasst: Samstag 8. April 2017, 14:57
von snafu
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.