Seite 1 von 1

Elemente aus einer Liste löschen

Verfasst: Sonntag 15. September 2013, 08:29
von Nergal53
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.

Re: Elemente aus einer Liste löschen

Verfasst: Sonntag 15. September 2013, 08:38
von Hyperion
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.

Re: Elemente aus einer Liste löschen

Verfasst: Sonntag 15. September 2013, 08:51
von Nergal53
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. ;)

Re: Elemente aus einer Liste löschen

Verfasst: Sonntag 15. September 2013, 09:51
von bwbg
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

Re: Elemente aus einer Liste löschen

Verfasst: Sonntag 15. September 2013, 10:59
von 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