Métodos de diccionarios
En la lección 10 aprendiste lo básico de diccionarios. Ahora vas a dominar los métodos avanzados que usan los profesionales: acceso seguro, merge, conteo de frecuencias, defaultdict y patrones de agrupación que son la base de lo que después harás con pandas groupby.
Concepto teórico
.get() vs .setdefault() — acceso seguro con matices
Ya conocés .get(clave, default): devuelve el valor si la clave existe, o el default si no. Pero
.get() NO modifica el diccionario — solo consulta. A veces necesitás algo más: si la clave no
existe, crearla con un valor inicial y DESPUÉS devolver ese valor. Para eso existe .setdefault():
d = {"nombre": "García"}
# .get() — solo consulta, no modifica
email = d.get("email", "sin dato") # devuelve "sin dato", d NO cambia
print(d) # {"nombre": "García"} — email NO se creó
# .setdefault() — consulta Y crea si no existe
email = d.setdefault("email", "sin dato") # devuelve "sin dato" Y lo agrega
print(d) # {"nombre": "García", "email": "sin dato"} — email SÍ se creó
.get() cuando solo querés leer sin
efectos secundarios (el 90% de los casos). .setdefault() cuando querés inicializar una clave la
primera vez que la encontrás — típico en patrones de agrupación manual..update() — merge de diccionarios
.update() combina dos diccionarios. Si hay claves repetidas, los valores del diccionario que pasás
como argumento sobreescriben los existentes:
base = {"nombre": "García", "score": 720}
nuevos = {"score": 735, "ciudad": "BsAs"} # score se sobreescribe
base.update(nuevos)
# base = {"nombre": "García", "score": 735, "ciudad": "BsAs"}
Desde Python 3.9, también podés usar el operador | para merge (devuelve nuevo dict) y
|= para merge in-place:
# Python 3.9+ combinado = base | nuevos # nuevo dict (no modifica base) base |= nuevos # modifica base in-place (como update)
.pop() y .popitem() — eliminar y obtener
.pop(clave, default)— elimina la clave y devuelve su valor. Si la clave no existe y no pasás default, daKeyError. Si pasás default, lo devuelve sin error..popitem()— elimina y devuelve el último par insertado como tupla(clave, valor). Útil para procesar un dict como cola LIFO.
Patrón: contador de frecuencias
Uno de los patrones más usados en análisis de datos es contar cuántas veces aparece cada valor. Hay tres formas, de menos a más elegante:
freq = {}
for item in datos:
if item in freq:
freq[item] += 1
else:
freq[item] = 1
Forma 2 — Con .get():
freq = {}
for item in datos:
freq[item] = freq.get(item, 0) + 1
Forma 3 — Con Counter (la mejor):
from collections import Counter freq = Counter(datos)
defaultdict — diccionarios con valor inicial automático
defaultdict del módulo collections es un diccionario que, cuando accedés a una clave
que no existe, automáticamente la crea con un valor inicial según el tipo que le pases:
defaultdict(int)— claves nuevas se crean con valor0defaultdict(list)— claves nuevas se crean con[](lista vacía)defaultdict(set)— claves nuevas se crean conset()defaultdict(float)— claves nuevas se crean con0.0
d["clave_inexistente"] (incluso sin asignar nada) agrega esa clave al diccionario. Esto puede
generar entradas "fantasma" si no tenés cuidado. Usalo solo cuando realmente necesitás la auto-creación.
Counter — el arma secreta para frecuencias
Counter de collections es una subclase de dict optimizada para contar. Tiene métodos
adicionales como .most_common(n) que devuelve los N elementos más frecuentes como lista de tuplas:
from collections import Counter
ventas = ["GGAL", "YPF", "GGAL", "PAMP", "GGAL", "YPF", "MELI"]
freq = Counter(ventas)
print(freq.most_common(2)) # [("GGAL", 3), ("YPF", 2)]
Counter es el equivalente manual de
df["columna"].value_counts(). Cuando no tenés pandas disponible (scripts simples, lambdas en AWS,
exámenes técnicos), Counter es tu mejor amigo.
Dict comprehensions avanzadas
Los patrones más útiles que no vimos en la lección 10:
- Invertir clave-valor:
{v: k for k, v in original.items()} - Filtrar por valor:
{k: v for k, v in d.items() if v > umbral} - Transformar valores:
{k: v * 1.21 for k, v in precios.items()} - Desde lista de tuplas:
{k: v for k, v in lista_tuplas} - Con .fromkeys():
dict.fromkeys(["a","b","c"], 0)— todas las claves con el mismo valor
defaultdict(list) + loop es tu herramienta. Es exactamente lo que hace
df.groupby("columna") por debajo.
Ejemplos explicados paso a paso
Ejemplo 1: .get() vs .setdefault() vs acceso directo
Hacé clic en ▶ Ejecutar
Ejemplo 2: update, pop, merge
Hacé clic en ▶ Ejecutar
Ejemplo 3: Counter y frecuencias
Hacé clic en ▶ Ejecutar
Ejemplo 4: defaultdict para agrupación
Hacé clic en ▶ Ejecutar
Ejemplo 5: Dict comprehensions avanzadas
Hacé clic en ▶ Ejecutar
Referencia rápida
| Método | Modifica dict? | Devuelve | Cuándo usar |
|---|---|---|---|
.get(k, default) |
No | Valor o default | Lectura segura (90% de los casos) |
.setdefault(k, v) |
Sí (si k no existe) | Valor existente o v | Inicializar clave la primera vez |
.update(dict2) |
Sí | None |
Merge de diccionarios |
.pop(k, default) |
Sí | Valor eliminado | Eliminar y usar el valor |
.popitem() |
Sí | (clave, valor) | Procesar como cola LIFO |
.fromkeys(keys, v) |
— | Nuevo dict | Template con claves predefinidas |
d1 | d2 (3.9+) |
No | Nuevo dict | Merge funcional |
d1 |= d2 (3.9+) |
Sí | None |
Merge in-place |
| Herramienta collections | Qué hace | Equivalente pandas |
|---|---|---|
Counter(iterable) |
Cuenta frecuencias | .value_counts() |
Counter.most_common(n) |
Top N más frecuentes | .value_counts().head(n) |
defaultdict(list) |
Agrupar valores por clave | .groupby().agg(list) |
defaultdict(int) |
Acumular sumas por clave | .groupby().sum() |
defaultdict(set) |
Acumular únicos por clave | .groupby().nunique() |
Ejercicios
Ejercicio 1: .get() con default
Dado prod = {"nombre": "Notebook", "precio": 920000}, usá .get() para acceder a
"stock" con default 0. Imprimí el resultado. Debe incluir Stock: 0.
Hacé clic en ▶ Ejecutar
Ejercicio 2: .update() para merge
Tenés base = {"nombre": "García", "score": 700} y
nuevo = {"score": 735, "ciudad": "BsAs"}. Mergealos con .update(). El score debe
quedar en 735. Debe incluir 735.
Hacé clic en ▶ Ejecutar
Ejercicio 3: .pop() para eliminar
Dado config = {"host": "db.local", "port": 5432, "debug": True}, eliminá "debug"
con .pop() y mostrá el valor eliminado. Debe incluir True.
Hacé clic en ▶ Ejecutar
Ejercicio 4: Contar frecuencias con .get()
Dada ciudades = ["BsAs","Córdoba","BsAs","Rosario","BsAs","Córdoba","Mendoza"], contá la
frecuencia de cada ciudad usando el patrón .get(k, 0) + 1. Debe incluir 3 (BsAs
aparece 3 veces).
Hacé clic en ▶ Ejecutar
Ejercicio 5: Counter con most_common
Dada la lista de tickers ["GGAL","YPF","GGAL","PAMP","GGAL","YPF","MELI","PAMP","GGAL"], usá
Counter para encontrar los 2 más operados. Debe incluir GGAL.
Hacé clic en ▶ Ejecutar
Ejercicio 6: Dict comprehension para filtrar
Dado saldos = {"García": 150000, "López": 320000, "Martínez": 45000, "Pérez": 890000}, creá un
nuevo dict solo con los que tienen saldo > $100K. Debe incluir Pérez.
Hacé clic en ▶ Ejecutar
Ejercicio 7: defaultdict(list) para agrupar
Agrupá estas transacciones por tipo usando defaultdict(list):
[("compra",1500), ("venta",800), ("compra",3200), ("venta",2100), ("compra",950)]. Imprimí el
total por tipo. Debe incluir 5650.
Hacé clic en ▶ Ejecutar
Ejercicio 8: Invertir diccionario
Dado codigos = {"AR": "Argentina", "BR": "Brasil", "CL": "Chile", "UY": "Uruguay"}, creá un dict
invertido (país → código) con comprehension. Debe incluir Argentina.
Hacé clic en ▶ Ejecutar
Ejercicio 9: Pipeline merge + transform
Tenés precios_q3 = {"GGAL": 4800, "YPF": 25000} y
precios_q4 = {"GGAL": 5200, "PAMP": 3100}. Mergealos (Q4 sobreescribe), después creá un nuevo
dict aplicando +10% a cada precio. Debe incluir 5720 (GGAL con 10%).
Hacé clic en ▶ Ejecutar
Ejercicio 10: Reporte de ventas agrupado por vendedor
Dadas estas ventas como lista de tuplas (vendedor, producto, monto), generá un reporte agrupado
por vendedor que muestre: cantidad de ventas, monto total, productos únicos y venta promedio. Usá defaultdict.
Debe incluir REPORTE.
Hacé clic en ▶ Ejecutar
Resumen y conexión
.get(k, default)lee sin modificar..setdefault(k, v)lee Y crea si no existe..update()y|/|=(3.9+) mergean diccionarios. Las claves del segundo sobreescriben..pop(k, default)elimina y devuelve..popitem()elimina el último par.Countercuenta frecuencias en una línea..most_common(n)da el top N.defaultdict(list/int/set)es el equivalente manual degroupbyen pandas.- Dict comprehensions filtran, transforman e invierten dicts en una línea.
En la siguiente lección (15 · Anidación) vas a combinar todo lo que aprendiste: listas de listas, listas de diccionarios, diccionarios de diccionarios y recorridos profundos sobre estructuras complejas.
Recursos: collections module · dict methods