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