Rimuovere Elementi
Scopri tutti i modi per rimuovere elementi da un dizionario Python: pop(), popitem(), del, clear() e le dict comprehension, con esempi e avvertenze.
I dizionari Python sono archivi chiave-valore mutabili, il che significa che puoi aggiungere, modificare e rimuovere voci in qualsiasi momento. Questo capitolo illustra tutte le tecniche standard per rimuovere elementi da un dizionario — pop(), popitem(), l'istruzione del, clear() e le dict comprehension — con note pratiche su quando ciascun approccio è più adatto e come evitare gli errori più comuni.
Confronto rapido
| Tecnica | Rimuove | Restituisce | Errore per chiave mancante |
|---|---|---|---|
dict.pop(key) | Una coppia chiave-valore | Il valore rimosso | KeyError (a meno che non sia fornito un default) |
dict.pop(key, default) | Una coppia chiave-valore | Il valore rimosso o il default | Mai |
dict.popitem() | L'ultima coppia inserita | Tupla (key, value) | KeyError se il dizionario è vuoto |
del dict[key] | Una coppia chiave-valore | Niente | KeyError |
dict.clear() | Tutte le coppie | Niente | Mai |
| Dict comprehension | Coppie selettive | Nuovo dizionario | Mai |
Rimuovere un singolo elemento con pop()
dict.pop(key) rimuove la coppia chiave-valore per la chiave specificata e restituisce il valore che era memorizzato lì. Questo lo rende utile quando hai bisogno del valore per ulteriori elaborazioni dopo la rimozione.
Rimuovere una chiave e acquisire il suo valore
Se la chiave non esiste, pop() solleva un KeyError:
inventory = {'apples': 10}
inventory.pop('oranges') # KeyError: 'oranges'Usare un default per evitare KeyError
Passa un secondo argomento a pop() come valore di fallback. Quando la chiave è assente, pop() restituisce il default invece di sollevare un errore — il dizionario rimane invariato.
Rimozione sicura con un default
inventory = {'apples': 10, 'cherries': 20}
removed = inventory.pop('oranges', 0)
print(removed) # 0
print(inventory) # {'apples': 10, 'cherries': 20}Questo schema è un'alternativa pulita al controllo if key in dict prima di chiamare pop().
Rimuovere l'ultimo elemento inserito con popitem()
dict.popitem() rimuove e restituisce l'ultima coppia chiave-valore inserita come tupla (key, value). Era lo strumento principale per iterare e consumare un dizionario prima che Python 3.7 garantisse l'ordine di inserimento.
Estrarre l'ultimo elemento inserito
scores = {'alice': 95, 'bob': 82, 'carol': 78}
last_item = scores.popitem()
print(last_item) # ('carol', 78)
print(scores) # {'alice': 95, 'bob': 82}popitem() solleva un KeyError se il dizionario è vuoto. Usalo quando vuoi elaborare e consumare tutti gli elementi uno per uno (come uno stack), oppure quando devi rimuovere solo l'ultima voce aggiunta di recente.
Rimuovere un elemento con del
L'istruzione del rimuove una coppia chiave-valore tramite chiave senza restituire alcun valore. Usala quando devi solo eliminare la voce e non hai interesse nel valore rimosso.
Eliminare una chiave con del
Come pop() senza un default, del solleva un KeyError se la chiave è mancante:
del user['phone'] # KeyError: 'phone'del vs pop() — quale usare?
- Usa
delquando vuoi scartare l'elemento e non hai mai bisogno del suo valore. - Usa
pop()quando hai bisogno del valore rimosso, o vuoi un'operazione sicura senza effetti quando la chiave potrebbe essere assente.
Rimuovere tutti gli elementi con clear()
dict.clear() svuota il dizionario sul posto, lasciando un {} vuoto. L'oggetto dizionario stesso esiste ancora, quindi qualsiasi altra variabile che fa riferimento allo stesso dict vedrà anch'essa un dict vuoto.
Cancellare tutte le voci
config = {'host': 'localhost', 'port': 5432, 'debug': True}
config.clear()
print(config) # {}Confronta questo con la riassegnazione config = {}: la riassegnazione crea un nuovo oggetto dizionario e lascia tutti gli altri riferimenti che puntano a quello vecchio (ancora popolato). clear() modifica lo stesso oggetto.
config = {'host': 'localhost', 'port': 5432}
alias = config # alias and config point to the same dict
config = {} # only config is updated; alias still has data
print(alias) # {'host': 'localhost', 'port': 5432}
config = {'host': 'localhost', 'port': 5432}
alias = config
config.clear() # modifies the shared object
print(alias) # {}Rimuovere più chiavi specifiche
Python non dispone di un metodo built-in per rimuovere più chiavi contemporaneamente, ma esistono due approcci idiomatici.
Loop con pop()
settings = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
to_remove = ['b', 'd']
for key in to_remove:
settings.pop(key, None) # None default = safe even if key is absent
print(settings) # {'a': 1, 'c': 3}Dictionary comprehension
Una dict comprehension costruisce un nuovo dizionario che esclude le chiavi indesiderate. È preferibile quando vuoi mantenere l'originale intatto.
Filtrare un dizionario con una comprehension
Puoi anche filtrare per valore anziché per chiave:
scores = {'alice': 95, 'bob': 40, 'carol': 78, 'dan': 35}
passing = {name: score for name, score in scores.items() if score >= 50}
print(passing) # {'alice': 95, 'carol': 78}Rimuovere elementi durante un ciclo — l'errore comune
Modificare un dizionario durante l'iterazione solleva un RuntimeError in Python 3:
data = {'a': 1, 'b': 2, 'c': 3}
# This raises RuntimeError: dictionary changed size during iteration
for key in data:
if data[key] < 2:
del data[key]Lo schema sicuro è iterare su una copia delle chiavi:
data = {'a': 1, 'b': 2, 'c': 3}
for key in list(data): # list() snapshots the keys
if data[key] < 2:
del data[key]
print(data) # {'b': 2, 'c': 3}In alternativa, costruisci un nuovo dict con una comprehension (mostrato sopra nella sezione comprehension) — questo è spesso l'approccio più pulito.
Per ulteriori informazioni sull'iterazione sicura dei dizionari, consulta Loop Dizionari.
Scegliere il metodo giusto
- Hai bisogno del valore rimosso? Usa
pop(key). - La chiave potrebbe non esistere? Usa
pop(key, default)per evitare unKeyError. - Stai solo eliminando, senza bisogno del valore? Usa
del dict[key]. - Rimuovere l'ultima voce inserita? Usa
popitem(). - Cancellare tutto? Usa
clear(). - Rimuovere in base a una condizione / più chiavi? Usa una dict comprehension o un ciclo
for key in list(dict).