1) Fast englischer Stil:
Testen Sie die Anwesenheit mit dem in
Operator und wenden Sie dann die remove
Methode an.
if thing in some_list: some_list.remove(thing)
Die remove
Methode entfernt nur das erste Vorkommen von thing
, um alle Vorkommen zu entfernen, die Sie while
anstelle von verwenden können if
.
while thing in some_list: some_list.remove(thing)
- Einfach genug, wahrscheinlich meine Wahl. Für kleine Listen (kann Einzeiler nicht widerstehen)
Diese Einstellung, bei der zuerst geschossen, Fragen gestellt und zuletzt geschossen wird, ist in Python üblich. Anstatt im Voraus zu testen, ob das Objekt geeignet ist, führen Sie einfach die Operation aus und fangen Sie relevante Ausnahmen ab:
try:
some_list.remove(thing)
except ValueError:
pass # or scream: thing not in some_list!
except AttributeError:
call_security("some_list not quacking like a list!")
Natürlich ist die zweite Ausnahmeklausel im obigen Beispiel nicht nur von fragwürdigem Humor, sondern völlig unnötig (der Punkt war, die Ententypisierung für Leute zu veranschaulichen, die mit dem Konzept nicht vertraut sind).
Wenn Sie mehrere Vorkommen von Dingen erwarten:
while True:
try:
some_list.remove(thing)
except ValueError:
break
- ein wenig ausführlich für diesen speziellen Anwendungsfall, aber in Python sehr idiomatisch.
- Dies ist besser als # 1
- PEP 463 schlug eine kürzere Syntax für try / mit Ausnahme der einfachen Verwendung vor, die hier nützlich wäre, wurde jedoch nicht genehmigt.
Mit dem in Python 3.4 eingeführten Context () - Kontextmanager von contextlib kann der obige Code jedoch folgendermaßen vereinfacht werden:
with suppress(ValueError, AttributeError):
some_list.remove(thing)
Nochmals, wenn Sie mehrere Vorkommen von Dingen erwarten:
with suppress(ValueError):
while True:
some_list.remove(thing)
3) Funktionsstil:
Um 1993, Python bekam lambda
, reduce()
, filter()
und map()
, mit freundlicher Genehmigung von einem Lisp - Hacker , die sie verpasst und legte Arbeits Patches *. Sie können filter
Elemente aus der Liste entfernen:
is_not_thing = lambda x: x is not thing
cleaned_list = filter(is_not_thing, some_list)
Es ist eine Abkürzung , die für Ihren Fall nützlich sein kann: Wenn Sie leere Elemente herausfiltern möchten (in der Tat Artikel , wo bool(item) == False
, wie None
, null, leere Zeichenfolge oder andere leere Sammlungen) Sie None als erstes Argument übergeben können:
cleaned_list = filter(None, some_list)
- [Update] : in Python 2.x,
filter(function, iterable)
früher äquivalent zu [item for item in iterable if function(item)]
(oder [item for item in iterable if item]
wenn das erste Argument ist None
); in Python 3.x entspricht es jetzt (item for item in iterable if function(item))
. Der subtile Unterschied besteht darin, dass der Filter zum Zurückgeben einer Liste verwendet wird. Jetzt funktioniert er wie ein Generatorausdruck. Dies ist in Ordnung, wenn Sie nur die bereinigte Liste durchlaufen und verwerfen. Wenn Sie jedoch wirklich eine Liste benötigen, müssen Sie den filter()
Aufruf einschließen mit dem list()
Konstruktor.
- * Diese Konstrukte mit Lispy-Geschmack gelten in Python als etwas fremd. Um 2005 sprach Guido sogar über
filter
das Löschen - zusammen mit Gefährten map
und reduce
(sie sind noch nicht verschwunden, reduce
wurden aber in das functools- Modul verschoben , das einen Blick wert ist, wenn Sie Funktionen höherer Ordnung mögen ).
4) Mathematischer Stil:
Das Listenverständnis wurde zum bevorzugten Stil für die Listenmanipulation in Python, seit es in Version 2.0 von PEP 202 eingeführt wurde . Das Grundprinzip dahinter ist, dass Listenverständnisse eine präzisere Möglichkeit bieten, Listen in Situationen zu erstellen, in denen derzeit map()
und filter()
und oder verschachtelte Schleifen verwendet werden.
cleaned_list = [ x for x in some_list if x is not thing ]
Generatorausdrücke wurden in Version 2.4 von PEP 289 eingeführt . Ein Generatorausdruck ist besser für Situationen geeignet, in denen Sie nicht wirklich eine vollständige Liste im Speicher erstellen müssen (oder möchten) - beispielsweise, wenn Sie nur die Elemente einzeln durchlaufen möchten. Wenn Sie nur die Liste durchlaufen, können Sie sich einen Generatorausdruck als ein faul ausgewertetes Listenverständnis vorstellen:
for item in (x for x in some_list if x is not thing):
do_your_thing_with(item)
Anmerkungen
- Möglicherweise möchten Sie
!=
stattdessen den Ungleichungsoperator verwenden is not
( der Unterschied ist wichtig ).
- Für Kritiker von Methoden, die eine Listenkopie implizieren: Entgegen der landläufigen Meinung sind Generatorausdrücke nicht immer effizienter als Listenverständnisse - bitte profilieren Sie sich, bevor Sie sich beschweren
Beachten Sie, dass dadurch nur eine Instanz der leeren Zeichenfolge aus Ihrer Liste entfernt wird (wie es auch Ihr Code getan hätte). Kann Ihre Liste mehr als eine enthalten?
quelle
Wenn
index
die gesuchte Zeichenfolge nicht gefunden wird, wird die angezeigte ZeichenfolgeValueError
ausgegeben. Fangen Sie entweder den ValueError ab:oder verwenden
find
, was in diesem Fall -1 zurückgibt.quelle
>>> s [u'Hello', u'Cool', u'Glam'] >>> i = s.find("") Traceback (most recent call last): File "<pyshell#42>", line 1, in <module> i = s.find("") AttributeError: 'list' object has no attribute 'find'
remove()
Ansatz von Time Pietscker ist viel direkter: Er zeigt direkt, was der Code tun soll (es ist in der Tat kein Zwischenindex erforderlichi
).Der Vollständigkeit halber wird diese Antwort hinzugefügt, obwohl sie nur unter bestimmten Bedingungen verwendet werden kann.
Wenn Sie sehr große Listen haben, müssen Sie die CPython-Interna nicht mehr am Ende der Liste entfernen
memmove
, wenn Sie die Liste neu anordnen können. Es gibt einen Leistungsgewinn, den Sie am Ende der Liste entfernen können, da nichtmemmove
jedes Element nach dem Element, das Sie entfernen, benötigt wird - einen Schritt zurück (1) .Bei einmaligen Entfernungen kann der Leistungsunterschied akzeptabel sein. Wenn Sie jedoch eine große Liste haben und viele Elemente entfernen müssen, werden Sie wahrscheinlich einen Leistungseinbruch bemerken.
Zugegebenermaßen ist in diesen Fällen die Durchführung einer vollständigen Listensuche wahrscheinlich auch ein Leistungsengpass, es sei denn, Elemente stehen meistens ganz oben auf der Liste.
Diese Methode kann zum effizienteren Entfernen verwendet werden,
sofern eine Neuordnung der Liste zulässig ist. (2)
Möglicherweise möchten Sie vermeiden, einen Fehler auszulösen, wenn der
item
nicht in der Liste enthalten ist.set
, insbesondere wenn die Liste keine Duplikate speichern soll.In der Praxis müssen Sie jedoch möglicherweise veränderbare Daten speichern, die nicht zu a hinzugefügt werden können
set
. Überprüfen Sie auch auf btree's, ob die Daten bestellt werden können.quelle
Eek, mach nichts so kompliziertes :)
Nur
filter()
deine Tags.bool()
GibtFalse
für leere Zeichenfolgen zurück, also anstelle vondu solltest schreiben
oder noch besser, setzen Sie diese Logik
striplist()
so ein, dass sie überhaupt keine leeren Zeichenfolgen zurückgibt.quelle
striplist
Funktion, wie kann ich Ihre Lösung einbinden: def striplist (l): "" entfernt Leerzeichen von Zeichenfolgen in einer Liste l "" "return ([x.strip () für x in l])[x.strip() for x in l if x.strip()]
oder verwenden Python-internenmap
undfilter
Funktionen wie folgt aus :filter(bool, map(str.strip, l))
. Wenn Sie es testen möchten, bewerten Sie dies im interaktiven Interpreter :filter(bool, map(str.strip, [' a', 'b ', ' c ', '', ' ']))
.None
anstelle desbool
ersten Arguments zu verwenden.Hier ist ein weiterer Einzeiler-Ansatz, den Sie dort rauswerfen sollten:
Es wird keine Listenkopie erstellt, es werden keine mehrfachen Durchläufe durch die Liste durchgeführt, es wird keine zusätzliche Ausnahmebehandlung erforderlich, und es wird das übereinstimmende Objekt oder Keine zurückgegeben, wenn keine Übereinstimmung vorliegt. Das einzige Problem ist, dass es für eine lange Aussage sorgt.
Wenn Sie nach einer Einzeilerlösung suchen, die keine Ausnahmen auslöst, ist next () der richtige Weg, da es eine der wenigen Python-Funktionen ist, die ein Standardargument unterstützen.
quelle
Alles was Sie tun müssen, ist dies
Aber diese Methode hat ein Problem. Sie müssen etwas an der Ausnahme platzieren, damit ich Folgendes gefunden habe:
quelle