Curso de Python / Guardar claves y valores con diccionarios
Un diccionario permite consultar un valor mediante una clave. Sirve para representar campos con nombre y acumular totales por categoría; decide expresamente si una clave ausente debe causar un error o utilizar un valor predeterminado.
Comprender las claves y la sustitución de valores
Un literal de diccionario contiene pares clave: valor entre llaves. Asignar un valor a una clave que ya existe sustituye su valor anterior; no añade otra aparición de la misma clave.
expense = {"name": "lunch", "amount": 8000}
expense["amount"] = 9000
print(expense["amount"])
Este código imprime 9000. Las claves de texto distinguen mayúsculas y espacios: food, Food y food son claves diferentes. Los diccionarios conservan el orden de inserción, pero no ordenan automáticamente los elementos por nombre o por importe.
Las claves deben ser hashables: su hash debe mantenerse estable durante su vida y los objetos que se comparan como iguales deben tener el mismo hash. Las cadenas y los enteros suelen ser adecuados; las listas no pueden usarse como claves. Una tupla que contiene una lista tampoco cumple ese requisito.
Consulta la referencia de dict y la definición oficial de hashable para precisar ese contrato.
Calcular totales por categoría
Guarda el siguiente programa como dicts.py en UTF-8. Ejecútalo con python dicts.py desde la carpeta de práctica y el entorno virtual seleccionado; utiliza python3 fuera del entorno en macOS o Ubuntu cuando corresponda.
expenses = [("food", 8000), ("transport", 2500), ("food", 3500)]
totals = {}
for category, amount in expenses:
totals[category] = totals.get(category, 0) + amount
for category, total in sorted(totals.items()):
print(category, total)
print(totals.get("books", 0))
La salida esperada muestra una única suma por categoría:
food 11500
transport 2500
0
En cada iteración, get(category, 0) recupera el acumulado anterior o empieza en cero. El nuevo importe se suma y se guarda otra vez bajo la misma clave. sorted(totals.items()) fija el orden de presentación de los pares.
Elegir entre una clave obligatoria y un valor predeterminado
totals["books"] produce KeyError si no existe esa clave. totals.get("books", 0) devuelve cero sin insertar books en el diccionario. Empezar en cero resulta útil para una suma, pero podría ocultar un registro inválido si faltara un campo obligatorio.
Recorre el propio diccionario para obtener claves, values() para valores e items() para pares. Cuando una acumulación necesita repetidamente una clave inicializada en cero, collections y defaultdict ofrecen otra forma de expresar esa intención.
Las copias de diccionarios son superficiales de forma predeterminada. Si un valor es una lista, esa lista puede seguir compartida entre la copia y el original. Los alias y los objetos mutables ayudan a distinguir un contenedor nuevo de datos internos independientes.
Comprobar normalización y cambios de estructura
- Cambia el importe 3500 de food por 4500. Solo el total de food debe pasar a 12500.
- Cambia una clave food por Food y observa que aparece un grupo separado. Decide deliberadamente si quieres normalizar mayúsculas.
- Si books es una categoría obligatoria, comprueba su presencia en lugar de interpretar silenciosamente su ausencia como cero.
Añadir o borrar claves mientras recorres ese mismo diccionario puede producir RuntimeError. Reúne primero las claves que vas a modificar o construye otro diccionario. Un valor predeterminado conveniente no debe decidir por sí solo si faltan datos importantes.




