1) stile quasi inglese:
Verificare la presenza utilizzando l' inoperatore, quindi applicare il removemetodo.
if thing in some_list: some_list.remove(thing)
Il removemetodo rimuoverà solo la prima occorrenza di thing, al fine di rimuovere tutte le occorrenze che è possibile utilizzare al whileposto di if.
while thing in some_list: some_list.remove(thing)
- Abbastanza semplice, probabilmente la mia scelta. Per piccoli elenchi (non posso resistere a una riga)
Questo atteggiamento di sparare prima di porre domande è comune in Python. Invece di testare in anticipo se l'oggetto è adatto, basta eseguire l'operazione e catturare le Eccezioni rilevanti:
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!")
Ovviamente la seconda clausola tranne nell'esempio sopra non è solo di umorismo discutibile ma del tutto superflua (il punto era quello di illustrare la tipizzazione di anatre per le persone che non hanno familiarità con il concetto).
Se ti aspetti più ricorrenze di cose:
while True:
try:
some_list.remove(thing)
except ValueError:
break
- un po 'prolisso per questo caso d'uso specifico, ma molto idiomatico in Python.
- questo funziona meglio del n. 1
- PEP 463 ha proposto una sintassi più breve per provare / tranne un semplice utilizzo che sarebbe utile qui, ma non è stato approvato.
Tuttavia, con il contestomanager suppress () di contextlib (introdotto in python 3.4) il codice sopra può essere semplificato a questo:
with suppress(ValueError, AttributeError):
some_list.remove(thing)
Ancora una volta, se ti aspetti più ricorrenze di cose:
with suppress(ValueError):
while True:
some_list.remove(thing)
3) Stile funzionale:
Intorno al 1993, Python ottenuto lambda, reduce(), filter()e map(), per gentile concessione di un Lisp hacker che li ha mancato e le patch di lavoro presentate *. È possibile utilizzare filterper rimuovere elementi dall'elenco:
is_not_thing = lambda x: x is not thing
cleaned_list = filter(is_not_thing, some_list)
C'è una scorciatoia che può essere utile per il tuo caso: se vuoi filtrare gli oggetti vuoti (in effetti elementi in cui bool(item) == False, come None, zero, stringhe vuote o altre raccolte vuote), puoi passare None come primo argomento:
cleaned_list = filter(None, some_list)
- [aggiornamento] : in Python 2.x,
filter(function, iterable)era equivalente a [item for item in iterable if function(item)](o [item for item in iterable if item]se il primo argomento è None); in Python 3.x, ora è equivalente a (item for item in iterable if function(item)). La sottile differenza è che il filtro ha usato per restituire un elenco, ora funziona come un'espressione del generatore - va bene se stai iterando sull'elenco pulito e scartandolo, ma se hai davvero bisogno di un elenco, devi racchiudere la filter()chiamata con il list()costruttore.
- * Questi costrutti al gusto di Lispy sono considerati un po 'alieni in Python. Intorno al 2005, Guido stava addirittura parlando di cadere
filter - insieme ai compagni mape reduce(non sono ancora andati ma sono reducestati spostati nel modulo functools , che vale la pena dare un'occhiata se ti piacciono le funzioni di alto ordine ).
4) Stile matematico:
La comprensione dell'elenco è diventata lo stile preferito per la manipolazione dell'elenco in Python da quando è stato introdotto nella versione 2.0 da PEP 202 . La logica alla base di ciò è che la comprensione degli elenchi fornisce un modo più conciso di creare elenchi in situazioni in cui map()e filter()e / o cicli annidati verrebbero attualmente utilizzati.
cleaned_list = [ x for x in some_list if x is not thing ]
Le espressioni del generatore sono state introdotte nella versione 2.4 da PEP 289 . Un'espressione del generatore è migliore per le situazioni in cui non è davvero necessario (o desiderato) creare un elenco completo in memoria, ad esempio quando si desidera semplicemente scorrere gli elementi uno alla volta. Se stai solo ripetendo l'elenco, puoi pensare all'espressione di un generatore come a una comprensione dell'elenco valutato pigro :
for item in (x for x in some_list if x is not thing):
do_your_thing_with(item)
Appunti
- potresti voler usare l'operatore di disuguaglianza
!=invece di is not( la differenza è importante )
- per i critici dei metodi che implicano una copia dell'elenco: contrariamente alla credenza popolare, le espressioni del generatore non sono sempre più efficienti della comprensione dell'elenco - si prega di fare un profilo prima di lamentarsi