HOWTO · Python

Come rimuovere un elemento da un dizionario di Python

Questo tutorial introduce come rimuovere un elemento da un dizionario Python

A volte il vostro dizionario Python contiene una o più chiavi che volete cancellare. Potete farlo in diversi modi.

L’istruzione del per rimuovere l’elemento del dizionario Python

Un approccio è quello di utilizzare l’affermazione integrata di Python del.

>>> meal = {'fats': 10, 'proteins': 10, 'carbohydrates': 80}
>>> del meal['fats']
>>> meal
{'proteins': 10, 'carbohydrates': 80}

Si noti che se si tenta di cancellare un elemento con una chiave che non è presente nel dizionario,
Python runtime lancerà un KeyError.

>>> meal = {'fats': 10, 'proteins': 10, 'carbohydrates': 80}
>>> del meal['water']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'water'

La funzione dict.pop() per rimuovere l’elemento dizionario Python

Un altro approccio è quello di usare la funzione dict.pop().
Il lato positivo di questo metodo è che permette di specificare
il valore di default da restituire se la chiave richiesta non esiste
nel dizionario.

>>> meal = {'fats': 10, 'proteins': 10, 'carbohydrates': 80}
>>> meal.pop('water', 3000)
3000
>>> meal.pop('fats', 3000)
10
>>> meal
{'proteins': 10, 'carbohydrates': 80} 

Si noti che se non si fornisce il valore predefinito da restituire e il valore richiesto
non esiste, si otterrà anche un errore di runtime, come del sopra.

>>> meal = {'fats': 10, 'proteins': 10, 'carbohydrates': 80}
>>> meal.pop('water')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'water'

Cancellare più elementi da un dizionario Python

Se è necessario cancellare più elementi da un dizionario in una sola volta,
Python 3 offre pratiche comprensioni di liste, che potete utilizzare a questo scopo.

>>> meal = {'fats': 10, 'proteins': 10, 'carbohydrates': 80}
>>> [meal.pop(key) for key in ['fats', 'proteins']]
[10, 10]
>>> meal
{'carbohydrates': 80}

Si noti che con l’approccio di cui sopra, Python si bloccherà comunque se una delle chiavi passate non è nel dizionario.
Per aggirare questo problema, si può dare un secondo argomento a dict.pop() come valore di ritorno predefinito.

>>> meal = {'fats': 10, 'proteins': 10, 'carbohydrates': 80}
>>> [meal.pop(key, None) for key in ['water', 'sugars']]
[None, None]
>>> meal
{'fats': 10, 'proteins': 10, 'carbohydrates': 80}

Caratteristiche delle prestazioni

Utilizzando del statement e dict.pop() hanno caratteristiche di prestazione diverse.

>>> from timeit import timeit
>>> timeit("meal = {'fats': 10, 'proteins': 10, 'carbohydrates': 80}; del meal['fats']")
0.12977536499965936
>>> timeit("meal = {'fats': 10, 'proteins': 10, 'carbohydrates': 80}; meal.pop('fats', None)")
0.21620816600079706

Come segue dai tempi sopra riportati, l’istruzione del è quasi due volte più veloce.

Tuttavia, dict.pop() con un valore di fallback è più sicuro in quanto vi aiuterà ad evitare errori di runtime.

Utilizzare il primo se si è sicuri che le chiavi devono essere presenti nel dizionario, e preferire il secondo in caso contrario.