Problem mit dem entfernen von Einträgen aus einer Liste

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
Herr Lehmann
User
Beiträge: 81
Registriert: Samstag 14. August 2010, 22:20

Unbearbeitete Liste: [[u'PETER'], [u'ANNA'], [u'PETER'], [u'ANNA'], [u'ANNA'], [u'ANNA'], [u'PETER', u'ANNA'], [u'PETER']]

Jetzt möchte ich alle Elemente die entweder Leer sind oder nur einen Namen enthalten entfernen:

Code: Alles auswählen

for chain in finalchain:
        if len(chain) <= 1:
            finalchain.remove(chain)
return finalchain
Das Resultat ist aber leider: [[u'ANNA'], [u'ANNA'], [u'ANNA'], [u'PETER', u'ANNA']]

Das verstehe ich nicht, nach meinem Verständnis müsste die for Schleife doch jedes Element in der Liste überprüfen und wenn es die Länge 1 oder 0 hat entfernen.

Gruß
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo.

Wenn du Elemente aus einer Liste entfernst über die du gerade Iteriest, dann zerstörst du dir damit den Iterator. Oder anders ausgedrückt: intern wird immer der Index gespeichert, der gerade durch die for-Schleife betrachtet wird. Löscht du nun das entsprechende Element, so verschieben sich alle Elemente in der Liste (rechts von dem Element) nach Links. Zusätzlich wird der Index um eins erhöht. Du lässt also ein Element aus.

Die einfachste und meist auch beste Lösung ist die erzeugung einer neuen Liste. Hier also einfach

Code: Alles auswählen

chain = [elem for elem in chain if len(chain) > 1]
Das kannst du natürlich auch mit einer "richtigen" Schleife machen.

Sebastian
Das Leben ist wie ein Tennisball.
Herr Lehmann
User
Beiträge: 81
Registriert: Samstag 14. August 2010, 22:20

Oh mann,

da wird so oft vor gewarnt. Auch hier im Forum... Aber wie das immer so ist, wenn man mal selbst betroffen ist erinnert man sich nicht daran. :roll:

Vielen Dank für die mal wieder sehr hilfreiche und erhellende Antwort.
nezzcarth
User
Beiträge: 1634
Registriert: Samstag 16. April 2011, 12:47

EyDu hat geschrieben: Die einfachste und meist auch beste Lösung ist die erzeugung einer neuen Liste.
Wäre die Lösung mit filter() hier gleichwertig, oder gäb es da irgendwelche Nachteile?
BlackJack

@nezzcarth: Das erzeugt auch eine neue Liste.
nezzcarth
User
Beiträge: 1634
Registriert: Samstag 16. April 2011, 12:47

@Blackjack: Danke, bin mir da immer nicht so sicher, was zu nehmen ist, wenn es mehrere Optionen gibt ;)

(wobei ich gerade sehe, dass es bei Python3 tatsächlich einen Unterschied macht...)
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Ist Geschmackssache.
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Barabbas
User
Beiträge: 349
Registriert: Dienstag 4. März 2008, 14:47

Guido van Rossum hat dazu mal was geschrieben - http://www.artima.com/weblogs/viewpost.jsp?thread=98196. Nur falls es den TE interessiert, will mich da jetzt gar nicht positionieren :)
BlackJack

@Barabbas: Naja „pretty uncontroversial“ war das letztendlich nicht. Und das Update ist ja auch irgendwie falsch beziehungsweise in sich widersprüchlich. ``reduce`` verschwindet aus der Standardbibliothek, aber man kann es aus `functools` importieren — ein Modul in der Standardbibliothek. Häh? Und ``lambda`` ist auch noch da. Das der „Diktator“ die Sachen nicht wirklich aus Python heraus bekommen hat, zeigt IMHO wie viel Benutzer es dann letztendlich doch gibt, die es verwenden und behalten wollten.
lunar

@BlackJack: Ist es jetzt ein Argument dafür, dass viele Benutzer diese Funktionen behalten wollen?! Wie war das gleich nochmal mit den Fliegen und der Sch....? War das sonst nicht immer Dein Argument?

Ist doch egal, wie viele Leute diese Funktionen behalten wollen, Guidos Argumente werden dadurch doch nicht entkräftet. Man kann sie auch schwerlich entkräften, denn streng genommen sind die meisten, mal abgesehen von "reduce()", doch durchaus korrekt. "map" und "filter" sind nur Spezialfälle der LC. "lambda" ist so beschränkt, dass man es wunderbar durch "functools.partial()" und "operator" ersetzen kann. Für alles, was darüber hinaus geht, kann man auf lokale, nicht-anonyme Funktionen zurückgreifen, was dann auch im Sinne der Lesbarkeit ist. Zumal "lambda" durch seine Semantik fehleranfällig ist. Wem ist es nicht schon mal passiert, dass er mit "lambda" unbeabsichtigterweise eine Closure erzeugt hat?
BlackJack

@lunar: Das ist gar kein Argument dafür oder dagegen. Nur die Feststellung das die „pretty uncontroversial“-Annahme, die er gleich zu Anfang gemacht hat, ihm um die Ohren geflogen ist. Das war dann nämlich doch kontrovers. Und ich glaube auch nicht, dass er sich den Massen gebeugt hat, sondern zu viel Gegenwind von Leuten kam, die direkt mit der Sprachentwicklung zu tun hatten, oder zumindest mit wichtigen externen Paketen/Modulen.

Dabei bleibt es dann für mich letztendlich bei der Ansage, dass das Geschmackssache ist. Denn spätestens bei Python 3 hätte man ``lambda`` zum Beispiel sonst raus werfen müssen, wenn das wirklich ungewollt wäre.
Antworten