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

list index out of range, Ursache?

Beitragvon Peak_me » 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

Beitragvon audax » 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

Beitragvon Peak_me » Mittwoch 28. Mai 2008, 17:52

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

Beitragvon 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)))

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder