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

for schleifen

Beitragvon ethereal86 » Mittwoch 4. Januar 2006, 23:46

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?
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Donnerstag 5. Januar 2006, 00:15

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 Modvoice
JROppenheimer
User
Beiträge: 13
Registriert: Mittwoch 7. Dezember 2005, 09:17
Wohnort: FFM
Kontaktdaten:

Beitragvon JROppenheimer » Donnerstag 5. Januar 2006, 11:57

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!
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Donnerstag 5. Januar 2006, 12:45

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 Modvoice
Benutzeravatar
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Beitragvon Joghurt » Donnerstag 5. Januar 2006, 14:15

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
Kontaktdaten:

Beitragvon JROppenheimer » Donnerstag 5. Januar 2006, 16:25

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!
Benutzeravatar
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Beitragvon Joghurt » Donnerstag 5. Januar 2006, 17:19

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
Kontaktdaten:

Beitragvon JROppenheimer » Donnerstag 5. Januar 2006, 17:23

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

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder