list index out of range, Ursache?

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
Peak_me
User
Beiträge: 92
Registriert: Sonntag 27. Januar 2008, 03:09

Mittwoch 28. Mai 2008, 17:28

Die Definition

Code: Alles auswählen

def bla(z,y):
   x=[z+10,z+9,z-1,z-10,z-9,z+1]
   lange=len(x)
   for m in range(lange):
        if x[m] in y:
           del x[m]
   return x
mit z=30 und y=[99,99,99,99,99,99,99,99]

liefert folgende Fehlermeldung:
Traceback (most recent call last):
File "blublub.py", line 524, in <module>
x2=bla(z,y)
File "blubblub.py", line 460, in umgebungsfelder
if x[m] in y:
IndexError: list index out of range
Liegt es daran, dass bei "if x[m] in y:" aus x ein Wert entfert wird, die Schleifendauer aber nicht angepasst wird und dadurch die Schleife öfter durchlaufen will, als es Werte in x gibt?
Wie kann ich die Fehlermeldung verhindern?


Danke!
Gruß
peak
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Mittwoch 28. Mai 2008, 17:41

Du veränderst die Länge einer Liste während du über 0-Ursprungslänge iterierst.

Erstell einfach eine neue Liste.

Code: Alles auswählen

def bla(z,y):
   x=[z+10,z+9,z-1,z-10,z-9,z+1]
   return [e for e in x if not e in y]
oder auch:

Code: Alles auswählen

from functools import partial
from operator import contains

def bla(z,y):
   x=[z+10,z+9,z-1,z-10,z-9,z+1]
   return filter(partial(contains, y) x)
Du solltest aber versuchen, den Teil in dem x zugewiesen zu vereinfachen.
Stichwort Magisch Zahlen.[/code]
Peak_me
User
Beiträge: 92
Registriert: Sonntag 27. Januar 2008, 03:09

Mittwoch 28. Mai 2008, 17:52

Danke für die schnelle Hilfe!
Deine erste Lösung funktioniert einwandfrei! :D
BlackJack

Mittwoch 28. Mai 2008, 19:23

Und noch eine Variation:

Code: Alles auswählen

def bla(z, y):
    return filter(set(y).__contains__, (z + x for x in (10, 9, -1, -10, -9, 1)))
Antworten