Seite 1 von 1

list index out of range, Ursache?

Verfasst: Mittwoch 28. Mai 2008, 17:28
von Peak_me
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

Verfasst: Mittwoch 28. Mai 2008, 17:41
von audax
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]

Verfasst: Mittwoch 28. Mai 2008, 17:52
von Peak_me
Danke für die schnelle Hilfe!
Deine erste Lösung funktioniert einwandfrei! :D

Verfasst: Mittwoch 28. Mai 2008, 19:23
von BlackJack
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)))