for schleifen

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
ethereal86
User
Beiträge: 5
Registriert: Sonntag 18. Dezember 2005, 19:07

tut mir leid für diese frage aber ich kriegs einfach nicht hin:

Code: Alles auswählen

test=[1,2]
for x in range(len(test)):
if(x==0):
test.remove(x)
leider kann ich nie ein element aus test löschen, wenn ich in der for schleife bin. kann mir das bitte jemand erklären?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Welche Programmiersprache ist denn das bitte? Python nutzt für for-Schleifen Einrückungen, von dem her kann dein Code nicht funktionieren.

Davon mal abgesehen ist es unklug durch eine Liste zu iterieren und sie während des Iterierens zu verändern, das führt zu komischen Problemen.

Ich würde es ja so machen, aber natürlich kann man auch filter() verwenden:

Code: Alles auswählen

test = [2, 4, 5, 0, 7]
ohne_null = [x for x in test if x != 0]
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
JROppenheimer
User
Beiträge: 13
Registriert: Mittwoch 7. Dezember 2005, 09:17
Wohnort: FFM

das problem mit deiner for-schleife ist:

x geht range(len(test)) durch, also 0, 1, ..., len(test)

wenn Du also sagst:

Code: Alles auswählen

test.remove(x)
dann versuchst DU erst 0, dann 1, dann 2 .... und zum schluss len(test) aus der Liste test zu löschen.

was Du meintest war wohl:

Code: Alles auswählen

test = [1,2]
for x in range(len(test)):
    if test[x] == 0:
        test.remove(test[x])
so geht der jeden Index der Liste durch, und lösche das Teil, wenn es 0 ist. Das wird aber probleme geben, weil "range(len(test))" wird nur einmal beim aufruf der schleife evaluiert, d.h. es wird nur einmal geschaut, wie lang test ist. und wenn du was löschst, ändert sich die Länge, folglich wird dein index x irgendwann größer sein, als test lang ist .... nciht schön :D

eine andere möglichkeit mit der schleife wäre so:

Code: Alles auswählen

test = [1,2}
for element in test:
    if element == 0:
        test.remove(element)
so nimmt die Variable "element" jeden wert aus test an, und löscht ihn, wenn er 0 ist. so hast Du auch keine indexvariable, die irgendwie über das ziel hinaus schiessen könnte.

wenn das Ziel ist, alle 0-en aus test zu löschen, würd hab ich das immer so gemacht(aber ich bin ein anfänger, gibt also sicherlich bessere und elegentere, und for allem "schnellere" Lösungen):

Code: Alles auswählen

while 0 in test:
    test.remove(0)

aber wie gesagt, ich bin anfänger, und ich hoffe ich hab hier keinen scheiss erzählt

hoffe auch, ich hab mich net vertippt,

liebe Grüße J.R.
YOU NO MESS WITH LO WANG!
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

JROppenheimer hat geschrieben:wenn das Ziel ist, alle 0-en aus test zu löschen, würd hab ich das immer so gemacht(aber ich bin ein anfänger, gibt also sicherlich bessere und elegentere, und for allem "schnellere" Lösungen):

Code: Alles auswählen

while 0 in test:
    test.remove(0)

aber wie gesagt, ich bin anfänger, und ich hoffe ich hab hier keinen scheiss erzählt
Nein, war schon ziemlich richtig. Allerdings würde ich Elemente wie schon geschrieben eher mit List Comprehensions löschen:

Code: Alles auswählen

test = [2, 4, 5, 0, 7]
# mit LC
ohne_null = [e for e in test if e != 0]
# oder alternativ mit filter()
ohne_null2 = filter(lambda e: e != 0, test)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

JROppenheimer hat geschrieben: was Du meintest war wohl:

Code: Alles auswählen

test = [1,2]
for x in range(len(test)):
    if test[x] == 0:
        test.remove(test[x]) 
Das geht nicht.

Stelle dir test = [0,0,1,0,2,0,3] vor.

x läuft von 0 bis 6.
x=0: test[0] = 0 -> erstes Element gelöscht (BTW: del test[x] macht dasselbe)
x=1: test[1] = 1 (das erste Element wurde ja gelöscht)...
test[6] gibt es ja jetzt schon nicht mehr, das Programm wird also mit einem Fehler aussteigen.

Man sollte nicht versuchen, Low-Level Methoden aus C oder Basic auf Python übertragen, das geht zwar, ist aber umständlich, fehleranfällig und langsam.
Python ist sehr mächtig und oft kann man direkt ausdrücken, was man machen will, und muss nicht explizit schreiben, wie man es machen will.
JROppenheimer
User
Beiträge: 13
Registriert: Mittwoch 7. Dezember 2005, 09:17
Wohnort: FFM

hast DU meinen Thread komplett gelesen?

ich hab ja extra erklärt, dass die erste for-Schleife net geht.... und der Fehler resultiert nicht mal NUR aus einem falschen Resultat, sondern, der macht das schon gar net bis zum ende, weil x größer wird, als die Liste Indizes hat.

deswegen hab ich ja weiter unten dann beschrieben, wie ICH es machen würde....

gruß J.R.
YOU NO MESS WITH LO WANG!
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

JROppenheimer hat geschrieben:ich hab ja extra erklärt, dass die erste for-Schleife net geht.... und der Fehler resultiert nicht mal NUR aus einem falschen Resultat, sondern, der macht das schon gar net bis zum ende, weil x größer wird, als die Liste Indizes hat.
Schon klar, wollte nur sagen, das selbst wenn len jedesmal evaluiert würde, das ganze nicht geht.
JROppenheimer
User
Beiträge: 13
Registriert: Mittwoch 7. Dezember 2005, 09:17
Wohnort: FFM

haha dann sind sich wieder alle einig und alle gehen fröhlich in den Sonnenuntergang :D
YOU NO MESS WITH LO WANG!
Antworten