QuieroProgramar por Rodri Gonzalez
Python · Lección 14 de 27

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.

80–100 min Prerrequisitos: 10 Diccionarios, 13 Métodos de listas
01

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ó
¿Cuándo usar cada uno? .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

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:

Forma 1 — Manual con if/else:
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:

Cuidado con defaultdict: como crea la clave al acceder, un simple 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)]
En pandas: 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:

Tip profesional: cuando necesitás "agrupar por" sin pandas, el patrón defaultdict(list) + loop es tu herramienta. Es exactamente lo que hace df.groupby("columna") por debajo.
02

Ejemplos explicados paso a paso

Ejemplo 1: .get() vs .setdefault() vs acceso directo

ejemplo_01_acceso.pyPython

        
Hacé clic en ▶ Ejecutar

Ejemplo 2: update, pop, merge

ejemplo_02_update_pop.pyPython

        
Hacé clic en ▶ Ejecutar

Ejemplo 3: Counter y frecuencias

ejemplo_03_counter.pyPython

        
Hacé clic en ▶ Ejecutar

Ejemplo 4: defaultdict para agrupación

ejemplo_04_defaultdict.pyPython

        
Hacé clic en ▶ Ejecutar

Ejemplo 5: Dict comprehensions avanzadas

ejemplo_05_comprehensions.pyPython

        
Hacé clic en ▶ Ejecutar
03

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) None Merge de diccionarios
.pop(k, default) Valor eliminado Eliminar y usar el valor
.popitem() (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+) 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()
04

Ejercicios

Nivel 1 · Básico

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.

ejercicio_01.pyDebe incluir "Stock: 0"

          
Hacé clic en ▶ Ejecutar
Nivel 1 · Básico

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.

ejercicio_02.pyDebe incluir "735"

          
Hacé clic en ▶ Ejecutar
Nivel 1 · Básico

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.

ejercicio_03.pyDebe incluir "True"

          
Hacé clic en ▶ Ejecutar
Nivel 2 · Intermedio

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).

ejercicio_04.pyDebe incluir "3"

          
Hacé clic en ▶ Ejecutar
Nivel 2 · Intermedio

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.

ejercicio_05.pyDebe incluir "GGAL"

          
Hacé clic en ▶ Ejecutar
Nivel 2 · Intermedio

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.

ejercicio_06.pyDebe incluir "Pérez"

          
Hacé clic en ▶ Ejecutar
Nivel 3 · Avanzado

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.

ejercicio_07.pyDebe incluir "5650"

          
Hacé clic en ▶ Ejecutar
Nivel 3 · Avanzado

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.

ejercicio_08.pyDebe incluir "Argentina"

          
Hacé clic en ▶ Ejecutar
Nivel 3 · Avanzado

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%).

ejercicio_09.pyDebe incluir "5720"

          
Hacé clic en ▶ Ejecutar
Nivel 4 · Desafío

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.

ejercicio_10_desafio.pyDebe incluir "REPORTE"

          
Hacé clic en ▶ Ejecutar
05

Resumen y conexión

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