Eliminar elementos
Aprende a eliminar elementos de un diccionario Python: pop(), popitem(), del, clear() y comprensiones de diccionario, con ejemplos y advertencias.
Los diccionarios de Python son almacenes de clave-valor mutables, lo que significa que puedes añadir, cambiar y eliminar entradas en cualquier momento. Este capítulo cubre todas las técnicas estándar para eliminar elementos de un diccionario — pop(), popitem(), la sentencia del, clear() y las comprensiones de diccionario — con notas prácticas sobre cuándo conviene usar cada enfoque y cómo evitar errores comunes.
Comparación rápida
| Técnica | Elimina | Devuelve | Lanza error si falta la clave |
|---|---|---|---|
dict.pop(key) | Un par clave-valor | El valor eliminado | KeyError (a menos que se dé un valor por defecto) |
dict.pop(key, default) | Un par clave-valor | El valor eliminado o el valor por defecto | Nunca |
dict.popitem() | El último par insertado | Tupla (key, value) | KeyError si el diccionario está vacío |
del dict[key] | Un par clave-valor | Nada | KeyError |
dict.clear() | Todos los pares | Nada | Nunca |
| Comprensión de diccionario | Pares seleccionados | Nuevo diccionario | Nunca |
Eliminar un elemento con pop()
dict.pop(key) elimina el par clave-valor de la clave indicada y devuelve el valor que estaba almacenado. Esto lo hace útil cuando necesitas el valor para procesarlo después de eliminarlo.
Eliminar una clave y capturar su valor
Si la clave no existe, pop() lanza un KeyError:
inventory = {'apples': 10}
inventory.pop('oranges') # KeyError: 'oranges'Usar un valor por defecto para evitar KeyError
Pasa un segundo argumento a pop() como valor de reserva. Cuando la clave está ausente, pop() devuelve el valor por defecto en lugar de lanzar un error — el diccionario queda sin cambios.
Eliminación segura con un valor por defecto
inventory = {'apples': 10, 'cherries': 20}
removed = inventory.pop('oranges', 0)
print(removed) # 0
print(inventory) # {'apples': 10, 'cherries': 20}Este patrón es una alternativa más limpia que comprobar if key in dict antes de llamar a pop().
Eliminar el último elemento insertado con popitem()
dict.popitem() elimina y devuelve el último par insertado como una tupla (key, value). Era la herramienta principal para iterar y consumir un diccionario antes de que Python 3.7 garantizara el orden de inserción.
Extraer el último elemento insertado
scores = {'alice': 95, 'bob': 82, 'carol': 78}
last_item = scores.popitem()
print(last_item) # ('carol', 78)
print(scores) # {'alice': 95, 'bob': 82}popitem() lanza un KeyError si el diccionario está vacío. Úsalo cuando quieras procesar y consumir todos los elementos uno a uno (como una pila), o cuando solo necesites eliminar la entrada añadida más recientemente.
Eliminar un elemento con del
La sentencia del elimina un par clave-valor por su clave sin devolver ningún valor. Úsala cuando solo necesites borrar la entrada y no te interese el valor eliminado.
Eliminar una clave con del
Al igual que pop() sin valor por defecto, del lanza un KeyError si la clave no existe:
del user['phone'] # KeyError: 'phone'del vs pop() — ¿cuál usar?
- Usa
delcuando quieras descartar el elemento y nunca necesites su valor. - Usa
pop()cuando necesites el valor eliminado, o quieras una operación segura sin efectos cuando la clave pueda estar ausente.
Eliminar todos los elementos con clear()
dict.clear() vacía el diccionario en su lugar, dejando un {} vacío. El objeto diccionario en sí sigue existiendo, por lo que cualquier otra variable que referencie el mismo dict también verá un diccionario vacío.
Borrar todas las entradas
config = {'host': 'localhost', 'port': 5432, 'debug': True}
config.clear()
print(config) # {}Compara esto con reasignar config = {}: la reasignación crea un nuevo objeto diccionario y deja cualquier otra referencia apuntando al antiguo (que aún contiene datos). clear() modifica el mismo objeto.
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) # {}Eliminar varias claves específicas
Python no tiene un método integrado para eliminar varias claves a la vez, pero hay dos enfoques idiomáticos.
Bucle 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}Comprensión de diccionario
Una comprensión de diccionario construye un nuevo diccionario que excluye las claves no deseadas. Es preferible cuando quieres mantener el original intacto.
Filtrar un diccionario mediante comprensión
También puedes filtrar por valor en lugar de por clave:
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}Eliminar elementos durante la iteración — el error más común
Modificar un diccionario durante la iteración lanza un RuntimeError en 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]El patrón seguro es iterar sobre una copia de las claves:
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}Alternativamente, construye un nuevo diccionario con una comprensión (mostrado arriba en la sección de comprensiones) — este suele ser el enfoque más limpio.
Para más información sobre cómo iterar diccionarios de forma segura, consulta Loop Dictionaries.
Elegir el método adecuado
- ¿Necesitas el valor eliminado? Usa
pop(key). - ¿La clave podría no existir? Usa
pop(key, default)para evitar unKeyError. - ¿Solo quieres eliminar, sin necesitar el valor? Usa
del dict[key]. - ¿Eliminar la última entrada insertada? Usa
popitem(). - ¿Borrar todo? Usa
clear(). - ¿Eliminar según una condición o varias claves? Usa una comprensión de diccionario o un bucle
for key in list(dict).