Rimozione di un elemento non presente in un elenco: ValueError?

3

Questo è qualcosa che mi ha infastidito per un po 'e non riesco a capire perché qualcuno vorrebbe che la lingua si comporti in questo modo:

In [1]: foo = [1, 2, 3]

In [2]: foo.remove(2) ; foo  # okay
Out[2]: [1, 3]

In [3]: foo.remove(4) ; foo  # not okay?
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)

/home/izkata/<ipython console> in <module>()

ValueError: list.remove(x): x not in list

Se il valore non è già presente nell'elenco, mi aspetterei un successo silenzioso. Obiettivo già raggiunto. C'è una ragione per cui questo è stato fatto in questo modo? Importa codice scomodo che dovrebbe essere molto più breve:

for item in items_to_remove:
   try:
      thingamabob.remove(item)
   except ValueError:
      pass

Invece di semplicemente:

for item in items_to_remove:
   thingamabob.remove(item)

Per inciso, no, non posso usare set(thingamabob).difference(items_to_remove) perché I do deve mantenere sia l'ordine che i duplicati.

    
posta Izkata 21.09.2012 - 16:24
fonte

2 risposte

4

Dalla filosofia di Python :

Explicit is better than implicit

Il metodo .remove() ha generato un'eccezione dal primo commit ; provare a rimuovere un valore che non è lì ti dà un feedback esplicito invece di assumere implicitamente che il valore non fosse buono e quello che volevi da sempre.

    
risposta data 21.09.2012 - 16:31
fonte
2

Per inciso: a meno che la tua lista sia estremamente grande e l'elenco di elementi da rimuovere sia troppo piccolo in confronto, puoi creare un nuovo elenco con gli elementi esclusi in una riga leggibile:

filtered_list = [x for x in source_list if x not in set(items_to_remove)]

Ovviamente conserva l'ordine e duplica come vuoi. Molto probabilmente è anche più veloce.

Molto spesso i dati non mutanti semplificano enormemente il modo in cui si pensa a un algoritmo.

    
risposta data 21.09.2012 - 19:58
fonte

Leggi altre domande sui tag