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.