Seite 1 von 1

Problem mit dem entfernen von Einträgen aus einer Liste

Verfasst: Sonntag 23. Oktober 2011, 11:59
von Herr Lehmann
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ß

Re: Problem mit dem entfernen von Einträgen aus einer Liste

Verfasst: Sonntag 23. Oktober 2011, 12:20
von EyDu
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

Re: Problem mit dem entfernen von Einträgen aus einer Liste

Verfasst: Sonntag 23. Oktober 2011, 12:22
von Herr Lehmann
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.

Re: Problem mit dem entfernen von Einträgen aus einer Liste

Verfasst: Sonntag 23. Oktober 2011, 18:42
von nezzcarth
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?

Re: Problem mit dem entfernen von Einträgen aus einer Liste

Verfasst: Sonntag 23. Oktober 2011, 18:48
von BlackJack
@nezzcarth: Das erzeugt auch eine neue Liste.

Re: Problem mit dem entfernen von Einträgen aus einer Liste

Verfasst: Sonntag 23. Oktober 2011, 18:58
von nezzcarth
@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...)

Re: Problem mit dem entfernen von Einträgen aus einer Liste

Verfasst: Sonntag 23. Oktober 2011, 19:06
von jbs
Ist Geschmackssache.

Re: Problem mit dem entfernen von Einträgen aus einer Liste

Verfasst: Sonntag 23. Oktober 2011, 19:56
von Barabbas
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 :)

Re: Problem mit dem entfernen von Einträgen aus einer Liste

Verfasst: Sonntag 23. Oktober 2011, 20:29
von 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.

Re: Problem mit dem entfernen von Einträgen aus einer Liste

Verfasst: Montag 24. Oktober 2011, 10:27
von 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?

Re: Problem mit dem entfernen von Einträgen aus einer Liste

Verfasst: Montag 24. Oktober 2011, 10:46
von 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.