1) Fast englischer Stil:
Testen Sie auf Anwesenheit mit dem in
Operator, dann die Anwendung der remove
método.
if thing in some_list: some_list.remove(thing)
Les remove
Methode wird nur das erste Vorkommen von thing
Um alle Vorkommen zu entfernen, können Sie while
anstelle von if
.
while thing in some_list: some_list.remove(thing)
- Einfach genug, wahrscheinlich meine Wahl. für kleine Listen (kann Einzeilern nicht widerstehen)
Diese Einstellung, zuerst zu schießen und dann Fragen zu stellen, ist in Python weit verbreitet. Anstatt im Voraus zu testen, ob das Objekt geeignet ist, führen Sie einfach die Operation aus und fangen 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 zweifelhaftem Humor, sondern auch völlig unnötig (es ging darum, die Enten-Typisierung für Leute zu veranschaulichen, die mit dem Konzept nicht vertraut sind).
Wenn Sie erwarten, dass eine Sache mehrmals vorkommt:
while True:
try:
some_list.remove(thing)
except ValueError:
break
- für diesen speziellen Anwendungsfall ein wenig langatmig, aber in Python sehr idiomatisch.
- Dies ist besser als die Nummer 1
- PEP 463 schlug eine kürzere Syntax für die einfache Verwendung von try/except vor, die hier nützlich wäre, aber sie wurde nicht angenommen.
Doch mit contextlibs suppress() Kontextmanager (eingeführt in Python 3.4) kann der obige Code wie folgt vereinfacht werden:
with suppress(ValueError, AttributeError):
some_list.remove(thing)
Nochmals, wenn Sie erwarten, dass eine Sache mehrfach vorkommt:
with suppress(ValueError):
while True:
some_list.remove(thing)
3) Funktionaler Stil:
Um 1993 erhielt Python lambda
, reduce()
, filter()
y map()
mit freundlicher Genehmigung eines Lispeln Hacker, der sie übersehen und funktionierende Patches* eingereicht hat. Sie können verwenden filter
um Elemente aus der Liste zu entfernen:
is_not_thing = lambda x: x is not thing
cleaned_list = filter(is_not_thing, some_list)
Es gibt eine Abkürzung, die für Ihren Fall nützlich sein könnte: Wenn Sie leere Einträge herausfiltern möchten (d. h. Einträge, bei denen bool(item) == False
, wie None
, Null, leere Zeichenketten oder andere leere Sammlungen), können Sie None als erstes Argument übergeben:
cleaned_list = filter(None, some_list)
- [Update] : in Python 2.x,
filter(function, iterable)
war früher gleichbedeutend mit [item for item in iterable if function(item)]
(oder [item for item in iterable if item]
wenn das erste Argument None
); in Python 3.x ist es jetzt äquivalent zu (item for item in iterable if function(item))
. Der feine Unterschied ist, dass filter früher eine Liste zurückgab, jetzt funktioniert es wie ein Generatorausdruck - das ist OK, wenn Sie nur über die bereinigte Liste iterieren und sie verwerfen, aber wenn Sie wirklich eine Liste brauchen, müssen Sie die filter()
Aufruf mit dem list()
Konstrukteur.
- *Diese Lispy-artigen Konstrukte gelten in Python als etwas fremdartig. Um 2005, Guido sprach sogar davon, die
filter
- zusammen mit Begleitern map
y reduce
(sie sind noch nicht weg, aber reduce
wurde in die functools Modul, das einen Blick wert ist, wenn Sie mögen Funktionen hoher Ordnung ).
4) Mathematischer Stil:
Listenauffassungen wurde zum bevorzugten Stil für die Listenmanipulation in Python seit der Einführung in Version 2.0 durch PEP 202 . Der Grundgedanke dahinter ist, dass List comprehensions eine prägnantere Möglichkeit bieten, Listen in Situationen zu erstellen, in denen map()
y 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 eingeführt durch PEP 289 . Ein Generatorausdruck eignet sich besser für Situationen, in denen Sie nicht unbedingt eine vollständige Liste im Speicher erstellen müssen (oder wollen) - z. B. wenn Sie nur ein Element nach dem anderen durchlaufen wollen. Wenn Sie nur über die Liste iterieren, können Sie sich einen Generatorausdruck als eine faul ausgewertet das Verständnis der Liste:
for item in (x for x in some_list if x is not thing):
do_your_thing_with(item)
Anmerkungen
- können Sie den Ungleichheitsoperator verwenden
!=
anstelle von is not
( der Unterschied ist wichtig )
- für Kritiker von Methoden, die eine Listenkopie voraussetzen: Entgegen der landläufigen Meinung sind Generatorausdrücke nicht immer effizienter als Listenauflösungen - bitte informieren Sie sich, bevor Sie sich beschweren