Elemente aus einer Liste löschen

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
Nergal53
User
Beiträge: 10
Registriert: Sonntag 15. September 2013, 08:26

Hallo,
ich würde gerne bestimmte Elemente aus einer Liste löschen mein Versuch war dieser:

Code: Alles auswählen

N = [0,1,2,3,4]

for i in N:
    print i
    if (i >= 3):
        N.remove(i)
print N
die Ausgabe ist aber [0,1,2,4]
Wie schaffe ich es das wirklich alle gelöscht werden?
Vielen Dank im Voraus.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Hallo,

lösche niemals Elemente aus einer Liste, die gerade durchlaufen wird! Erzeuge einfach eine neue, die nur die gewünschten Elemente enthält:

Code: Alles auswählen

values = [0, 1, 2, 3, 4]
small_values = []

for value in values:
    if value < 3:
        small_values.append(value)

small_values
> [0, 1, 2]

# oder auch:

filter(lambda x: x < 3, values)
> [0, 1, 2]

[value for value in values if value < 3]
> [0, 1, 2]
Nebenbei: Deine Namensgebung ist schlecht! Beachte mehr PEP8. Was ist ``N``? Und wieso sind da ``i``s drin? Namen sollten einem mitteilen, *was* sich dahinter verbirgt.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Nergal53
User
Beiträge: 10
Registriert: Sonntag 15. September 2013, 08:26

Danke für die schnelle Antwort. :)
Das mit der schlechten Bezeichnung ist mit bekannt, ich habe mein Problem auch nur auf dieses einfache Beispiel abstrahiert.
In meinem richtigen Programm ist alles fein säuberlich bezeichnet. ;)
Benutzeravatar
bwbg
User
Beiträge: 407
Registriert: Mittwoch 23. Januar 2008, 13:35

OT:

Gut, dass Dir das bekannt ist. Es hilft jedoch dem Helfenden ungemein, wenn man sich auch bei reduzierten Problemen an die akzeptierten style-guides (hier: PEP8) hält.

Selbst wenn ich bei Hyperions Beispiel in der Mitte anfange zu Lesen, weiß ich, welche Art (im Sinne von Verhalten) von Objekt sich hinter den Namen verbergen. Bei Deinem 'i' denke ich zuerst an einen (Listen-) Index.

Wobei das natürlich auch der Gewohnheit geschuldet ist.

Grüße ... bwbg
"Du bist der Messias! Und ich muss es wissen, denn ich bin schon einigen gefolgt!"
BlackJack

Falls die Werte-Listen grunsätzlich aufsteigend sortiert sind, dann könnte man die Schleife auch abbrechen oder `itertools.takewhile()` verwenden:

Code: Alles auswählen

In [46]: values = [0, 1, 2, 3, 4]

In [47]: small_values = list(takewhile(lambda x: x < 3, values))

In [48]: small_values
Out[48]: [0, 1, 2]
Oder man wird etwas „kreativ” und schreibt eine Funktion mit der man Generatorausdrücke abbrechen kann:

Code: Alles auswählen

In [56]: list(value for value in values if stop_when(value >= 3))
Out[56]: [0, 1, 2]
Mit `stop_when()`:

Code: Alles auswählen

def stop_when(should_stop):
    if should_stop:
        raise StopIteration()
    return True
Antworten