Diccionarios
Los diccionarios son la estructura de datos más importante para representar datos del mundo real. Cada fila de una base de datos, cada registro JSON de una API y cada fila de un CSV es esencialmente un diccionario: pares de clave y valor.
Concepto teórico
¿Qué es un diccionario?
Un diccionario (dict) es una colección de pares clave: valor. Cada clave
es un identificador único que apunta a un valor. Es como un diccionario real de idiomas: buscás una palabra
(clave) y encontrás su definición (valor). En Python se crean con llaves {}.
cliente = {
"nombre": "García",
"edad": 35,
"ciudad": "Buenos Aires",
"score": 720,
"saldo": 250000,
"activo": True
}
A diferencia de las listas (que accedés por posición numérica), en los diccionarios accedés por
clave: cliente["nombre"] devuelve "García". Esto es mucho más legible
y mantenible que cliente[0].
.to_dict(). Y cuando leas un JSON de una API, lo que recibís es un diccionario (o lista de
diccionarios).
Características de los diccionarios
- Ordenados (desde Python 3.7+): mantienen el orden de inserción. Antes de 3.7 no lo garantizaban.
- Mutables: podés agregar, modificar y eliminar pares clave-valor después de crear el diccionario.
- Claves únicas: si asignás dos veces la misma clave, la segunda sobreescribe la primera. No hay claves duplicadas.
- Claves inmutables: las claves deben ser hashables (strings, números, tuplas). Las listas NO pueden ser claves.
- Valores de cualquier tipo: el valor puede ser int, str, list, otro dict, función, lo que sea.
- Acceso O(1): buscar por clave es instantáneo (no importa si el diccionario tiene 10 o 10 millones de entradas). Las listas necesitan O(n) para buscar un valor.
Acceso: [] vs .get()
Hay dos formas de acceder a un valor:
dict["clave"]— devuelve el valor. Si la clave NO existe, lanzaKeyError(error).dict.get("clave", default)— devuelve el valor. Si la clave no existe, devuelvedefault(en vez de error). Si no pasás default, devuelveNone.
.get() siempre que no estés 100% seguro
de que la clave existe. En datos del mundo real, nunca sabés si un campo viene completo. Un
KeyError en producción a las 3 AM te arruina el fin de semana. Un .get("score", 0) te
devuelve un valor seguro.
Agregar, modificar y eliminar
Agregar y modificar usan la misma sintaxis: dict["clave"] = valor. Si la clave no existe, la crea.
Si existe, la sobreescribe.
Para eliminar: del dict["clave"] (lanza error si no existe) o
dict.pop("clave", default) (seguro, devuelve el valor eliminado).
Recorrer diccionarios
Los tres métodos de iteración que usás constantemente:
.keys()— devuelve las claves.for k in dict.keys():(o simplementefor k in dict:).values()— devuelve los valores.for v in dict.values():.items()— devuelve pares (clave, valor).for k, v in dict.items():— el más usado.
Diccionarios anidados
Un diccionario puede contener otros diccionarios como valores. Esto es la forma natural de representar datos JSON, que es el formato estándar de las APIs web:
cliente = {
"nombre": "García",
"scoring": {"valor": 720, "fecha": "2025-01-15", "entidad": "BCRA"},
"cuentas": [
{"tipo": "CA$", "saldo": 150000},
{"tipo": "CA USD", "saldo": 5000}
]
}
# Acceso anidado:
print(cliente["scoring"]["valor"]) # 720
print(cliente["cuentas"][0]["saldo"]) # 150000
df.to_dict('records'), obtenés una lista de dicts. Cada vez que hagas
requests.get(url).json(), obtenés un dict.
Dict comprehensions
Al igual que las list comprehensions, podés crear diccionarios en una línea:
{clave: valor for item in iterable if condición}
{v: k for k, v in original.items()}), filtrar
pares ({k: v for k, v in d.items() if v > 100000}), o crear mappings
({nombre: score for nombre, score in zip(nombres, scores)}).Ejemplos explicados paso a paso
Ejemplo 1: Crear, acceder y modificar
Las operaciones CRUD (Create, Read, Update, Delete) básicas de un diccionario.
Hacé clic en ▶ Ejecutar
Ejemplo 2: Recorrer con .items() — el patrón más usado
El 80% de las veces que trabajás con diccionarios, los recorrés con .items().
Hacé clic en ▶ Ejecutar
Ejemplo 3: Lista de diccionarios — la "base de datos en memoria"
Este es el patrón más importante del curso. Una lista de diccionarios es exactamente lo que devuelve
df.to_dict('records') en pandas.
Hacé clic en ▶ Ejecutar
Ejemplo 4: Dict comprehensions
Creá y transformá diccionarios en una sola línea.
Hacé clic en ▶ Ejecutar
Ejemplo 5: Diccionarios anidados — simulando JSON
Los datos de APIs y bases de datos NoSQL vienen como diccionarios anidados. Aprender a navegar estas estructuras es esencial.
Hacé clic en ▶ Ejecutar
Referencia rápida
| Operación | Sintaxis | Nota |
|---|---|---|
| Crear | {"k": v} o dict(k=v) |
Las claves deben ser únicas |
| Leer (inseguro) | d["clave"] |
KeyError si no existe |
| Leer (seguro) | d.get("clave", default) |
Devuelve default si no existe |
| Agregar/Modificar | d["clave"] = valor |
Crea si no existe, sobreescribe si existe |
| Eliminar (inseguro) | del d["clave"] |
KeyError si no existe |
| Eliminar (seguro) | d.pop("clave", default) |
Devuelve el valor eliminado |
| Merge | d.update(otro_dict) |
Agrega/sobreescribe con otro dict |
| Claves | d.keys() |
Vista de claves |
| Valores | d.values() |
Vista de valores |
| Pares | d.items() |
Vista de (clave, valor) |
| Pertenencia | "clave" in d |
True/False — O(1) |
| Largo | len(d) |
Cantidad de pares |
| Copiar | d.copy() |
Copia superficial |
| Vaciar | d.clear() |
Elimina todo |
| Comprehension | {k:v for k,v in ...} |
Crear dict en una línea |
Ejercicios
Ejercicio 1: Crear y acceder
Creá un diccionario producto con claves nombre, precio y
stock. Imprimí cada valor. Debe incluir el nombre del producto.
Hacé clic en ▶ Ejecutar
Ejercicio 2: .get() seguro
Dado un diccionario de cliente sin campo "email", usá .get() para acceder al email con default
"No informado". Debe incluir No informado.
Hacé clic en ▶ Ejecutar
Ejercicio 3: Recorrer con .items()
Dado moneda = {"nombre": "Dólar", "código": "USD", "cotización": 1150}, recorrelo con
.items() e imprimí cada par. Debe incluir USD.
Hacé clic en ▶ Ejecutar
Ejercicio 4: Agregar, modificar y eliminar
Partiendo de {"nombre": "López", "saldo": 100000}: agregá "ciudad": "Córdoba",
modificá saldo a 150000, eliminá ciudad con .pop(). Imprimí el dict final. Debe
incluir 150000.
Hacé clic en ▶ Ejecutar
Ejercicio 5: Dict comprehension desde listas
Tenés tickers = ["GGAL", "YPF", "PAMP"] y precios = [5200, 28000, 3100]. Creá un
diccionario con dict comprehension y zip. Imprimilo. Debe incluir GGAL.
Hacé clic en ▶ Ejecutar
Ejercicio 6: Contar frecuencias
Dada
transacciones = ["compra", "venta", "compra", "compra", "venta", "transferencia", "compra"],
contá cuántas veces aparece cada tipo usando un diccionario. Debe incluir compra y
4.
Hacé clic en ▶ Ejecutar
Ejercicio 7: Filtrar lista de diccionarios
Dada una lista de 4 clientes (dict con nombre, score, saldo), filtrá los que tienen score >= 650 y calculá el
saldo promedio de los filtrados. Debe incluir Promedio.
Hacé clic en ▶ Ejecutar
Ejercicio 8: Diccionario anidado
Creá un diccionario sucursal con "nombre", "ciudad" y
"empleados" (lista de dicts con nombre y cargo). Imprimí el nombre del primer empleado accediendo
a la estructura anidada. Debe incluir Gerente.
Hacé clic en ▶ Ejecutar
Ejercicio 9: Transformar dict con comprehension
Dado precios_ars = {"Notebook": 920000, "Mouse": 23000, "Teclado": 46000} y
DOLAR = 1150, creá un nuevo diccionario con los precios en USD (dividir por DOLAR, redondear a 2
decimales). Debe incluir USD.
Hacé clic en ▶ Ejecutar
Ejercicio 10: Reporte de cartera desde lista de dicts
Dada una lista de 5 clientes (nombre, ciudad, score, saldo), generá un reporte que incluya: tabla con todos
los clientes, total de la cartera, promedio por ciudad (agrupación manual), y el cliente con mayor saldo. Debe
incluir REPORTE.
Hacé clic en ▶ Ejecutar
Resumen y conexión
- Los diccionarios guardan pares
clave: valor. Se crean con{}. Acceso por clave, no por posición. - Usá
.get("clave", default)para acceso seguro (sin KeyError). - Recorrer con
.items()es el patrón más común:for k, v in dict.items(): - Una lista de diccionarios es la "base de datos en memoria" — el paso previo a DataFrames de pandas.
- Dict comprehensions (
{k:v for ...}) permiten crear y transformar dicts en una línea. - Los dicts anidados representan JSON — el formato estándar de APIs y datos web.
En la siguiente lección (11 · Sets) vas a aprender la última estructura de datos fundamental: conjuntos sin duplicados, ideales para deduplicar datos y hacer operaciones matemáticas de conjuntos.
Recursos: Python docs — Dictionaries · dict methods