1) Prawie angielski styl:
Sprawdź obecność za pomocą inoperatora, a następnie zastosuj removemetodę.
if thing in some_list: some_list.remove(thing)
removeMetoda usunie tylko pierwsze wystąpienie thing, w celu usunięcia wszystkich wystąpień można użyć whilezamiast if.
while thing in some_list: some_list.remove(thing)
- Dość proste, prawdopodobnie mój wybór. Dla małych list (nie mogę się oprzeć jednowarstwowym)
Ta postawa „najpierw strzelaj, zadawaj pytania, ostatnia” jest powszechna w Pythonie. Zamiast wcześniej przetestować, czy obiekt jest odpowiedni, po prostu wykonaj operację i wychwyć odpowiednie wyjątki:
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!")
Oczywiście druga klauzula z wyjątkiem powyższego przykładu ma nie tylko wątpliwy humor, ale jest całkowicie niepotrzebna (chodziło o zilustrowanie pisania kaczką osobom, które nie znają tego pojęcia).
Jeśli oczekujesz wielu wystąpień rzeczy:
while True:
try:
some_list.remove(thing)
except ValueError:
break
- trochę verbose dla tego konkretnego przypadku użycia, ale bardzo idiomatyczny w Pythonie.
- to działa lepiej niż # 1
- PEP 463 zaproponował krótszą składnię dla try / oprócz prostego użycia, które byłoby przydatne tutaj, ale nie został zatwierdzony.
Jednak za pomocą menedżera kontekstu suppress () kontekstowego (wprowadzonego w Pythonie 3.4) powyższy kod można uprościć do tego:
with suppress(ValueError, AttributeError):
some_list.remove(thing)
Ponownie, jeśli oczekujesz wielu wystąpień rzeczy:
with suppress(ValueError):
while True:
some_list.remove(thing)
3) Styl funkcjonalny:
Około 1993, Python got lambda, reduce(), filter()i map(), dzięki uprzejmości Lisp hakerów, którzy je pominąć i złożone łaty roboczych *. Możesz użyć filterdo usunięcia elementów z listy:
is_not_thing = lambda x: x is not thing
cleaned_list = filter(is_not_thing, some_list)
Istnieje skrót, który może być przydatny w twoim przypadku: jeśli chcesz odfiltrować puste elementy (w rzeczywistości elementy, w których bool(item) == Falsenp. NoneZero, puste ciągi znaków lub inne puste kolekcje), możesz przekazać None jako pierwszy argument:
cleaned_list = filter(None, some_list)
- [aktualizacja] : w Pythonie 2.x,
filter(function, iterable)był równoważny [item for item in iterable if function(item)](lub [item for item in iterable if item]jeśli pierwszy argument jest None); w Pythonie 3.x jest teraz równoważne z (item for item in iterable if function(item)). Subtelna różnica polega na tym, że filtr użyty do zwrócenia listy, teraz działa jak wyrażenie generatora - jest to OK, jeśli iterujesz tylko po oczyszczonej liście i odrzucasz ją, ale jeśli naprawdę potrzebujesz listy, musisz dołączyć filter()wywołanie z list()konstruktorem.
- * Te konstrukcje o smaku Lispy są w Pythonie uważane za trochę obcych. Około 2005 roku Guido mówił nawet o upuszczeniu
filter - wraz z towarzyszami mapi reduce(jeszcze ich nie ma, ale reducezostał przeniesiony do modułu funools , który warto sprawdzić, jeśli lubisz funkcje wyższego rzędu ).
4) Styl matematyczny:
Rozumienie list stało się preferowanym stylem do manipulowania listami w Pythonie od czasu wprowadzenia go w wersji 2.0 przez PEP 202 . Uzasadnieniem jest to, że Ułatwienia Lista zapewnić bardziej zwięzły sposób tworzenia list w sytuacjach, w których map()i filter()będzie stosowane obecnie i / lub zagnieżdżone pętle.
cleaned_list = [ x for x in some_list if x is not thing ]
Wyrażenia generatora zostały wprowadzone w wersji 2.4 przez PEP 289 . Wyrażenie generatora jest lepsze w sytuacjach, w których tak naprawdę nie potrzebujesz (lub nie chcesz) mieć pełnej listy utworzonej w pamięci - na przykład gdy chcesz po prostu iterować elementy pojedynczo. Jeśli iterujesz tylko po liście, możesz pomyśleć o wyrażeniu generatora jako leniwym zrozumieniu listy:
for item in (x for x in some_list if x is not thing):
do_your_thing_with(item)
Notatki
- możesz
!=zamiast tego użyć operatora nierówności is not( różnica jest ważna )
- dla krytyków metod sugerujących kopię listy: wbrew powszechnemu przekonaniu, wyrażenia generatora nie zawsze są bardziej wydajne niż listy - prosimy o profil przed złożeniem skargi