Diccionarios en Python

Los diccionarios almacenan pares clave: valor. Son perfectos para representar objetos del mundo real y estructurar datos con nombres descriptivos.

¿Qué es un Diccionario?

Un diccionario guarda datos en pares clave: valor entre llaves {}. A diferencia de las listas, accedés a los valores por su nombre, no por posición.

persona = {
    "nombre": "Ana",
    "edad":   28,
    "ciudad": "Córdoba",
    "activo": True
}

# Acceder por clave
print(persona["nombre"])   # Ana
print(persona["edad"])     # 28

# Otra forma segura: get() (no lanza error si la clave no existe)
print(persona.get("email", "sin email"))  # sin email
Claves únicas

Cada clave debe ser única en el diccionario. Si asignás un valor a una clave que ya existe, la sobreescribís. Las claves suelen ser strings, pero también pueden ser números o tuplas.

Probá el Ejemplo 1: Crear y acceder

Agregar, modificar y eliminar

producto = {"nombre": "Laptop", "precio": 1200}

# Agregar una clave nueva
producto["stock"] = 15
producto["marca"] = "TechCo"

# Modificar un valor existente
producto["precio"] = 999

# Eliminar una clave
del producto["marca"]

# pop() — elimina y devuelve el valor
stock = producto.pop("stock")
print(f"Stock eliminado: {stock}")

print(producto)  # {'nombre': 'Laptop', 'precio': 999}

update() — fusionar diccionarios

base = {"nombre": "Ana", "edad": 28}
extra = {"ciudad": "Córdoba", "edad": 29}  # edad se sobreescribe

base.update(extra)
print(base)  # {'nombre': 'Ana', 'edad': 29, 'ciudad': 'Córdoba'}
Probá el Ejemplo 2: Modificar diccionarios

keys(), values() e items()

Tres métodos esenciales para recorrer un diccionario:

persona = {"nombre": "Carlos", "edad": 35, "ciudad": "Rosario"}

# Solo las claves
for clave in persona.keys():
    print(clave)          # nombre, edad, ciudad

# Solo los valores
for valor in persona.values():
    print(valor)          # Carlos, 35, Rosario

# Claves y valores juntos (lo más usado)
for clave, valor in persona.items():
    print(f"{clave}: {valor}")
items() es el más usado

En la mayoría de los casos vas a querer tanto la clave como el valor. for clave, valor in dic.items() es el patrón estándar para recorrer un diccionario completo.

Verificar existencia de una clave

if "email" in persona:
    print(persona["email"])
else:
    print("No tiene email registrado")

# Forma compacta con get()
email = persona.get("email", "no registrado")
print(f"Email: {email}")
Probá el Ejemplo 3: Recorrer diccionarios

Diccionarios anidados

Un diccionario puede contener otros diccionarios como valores — ideal para datos jerárquicos.

empresa = {
    "nombre": "TechCorp",
    "empleados": {
        "ana": {"cargo": "Dev",     "salario": 3000},
        "carlos": {"cargo": "QA",   "salario": 2500},
        "beatriz": {"cargo": "UX",  "salario": 2800},
    }
}

# Acceder a datos anidados
print(empresa["nombre"])                          # TechCorp
print(empresa["empleados"]["ana"]["cargo"])       # Dev
print(empresa["empleados"]["carlos"]["salario"])  # 2500

# Recorrer empleados
for nombre, datos in empresa["empleados"].items():
    print(f"{nombre.capitalize()}: {datos['cargo']} — ${datos['salario']}")

Métodos útiles

get(clave, default)

d.get("x", 0)

Devuelve el valor o el default si no existe la clave

keys()

list(d.keys())

Lista de todas las claves

values()

list(d.values())

Lista de todos los valores

items()

for k, v in d.items()

Pares clave-valor para iterar

update(otro_dict)

d.update({"x": 1})

Fusiona otro diccionario

pop(clave)

d.pop("x")

Elimina y devuelve el valor

setdefault(clave, val)

d.setdefault("x", 0)

Asigna el valor solo si la clave no existe

copy()

d2 = d.copy()

Copia superficial del diccionario

Ejemplo Completo

Sistema de inventario usando diccionarios:

inventario = {
    "laptop":   {"precio": 1200, "stock": 5,  "categoria": "electrónica"},
    "mouse":    {"precio": 25,   "stock": 30, "categoria": "electrónica"},
    "teclado":  {"precio": 75,   "stock": 20, "categoria": "electrónica"},
    "silla":    {"precio": 350,  "stock": 8,  "categoria": "muebles"},
    "escritorio": {"precio": 500, "stock": 3, "categoria": "muebles"},
}

def valor_total(inv):
    return sum(datos["precio"] * datos["stock"] for datos in inv.values())

def productos_por_categoria(inv, categoria):
    return {k: v for k, v in inv.items() if v["categoria"] == categoria}

def stock_bajo(inv, minimo=5):
    return {k: v for k, v in inv.items() if v["stock"] <= minimo}

# Mostrar inventario
print(f"{'Producto':<12} {'Precio':>8} {'Stock':>6} {'Subtotal':>10}")
print("-" * 40)
for nombre, datos in inventario.items():
    subtotal = datos["precio"] * datos["stock"]
    print(f"{nombre:<12} ${datos['precio']:>7} {datos['stock']:>6} ${subtotal:>9}")
print(f"\nValor total del inventario: ${valor_total(inventario):,.2f}")

print("\n--- Stock bajo (≤ 5 unidades) ---")
for nombre, datos in stock_bajo(inventario).items():
    print(f"  ⚠️  {nombre}: {datos['stock']} unidades")
Probá el Ejemplo 4: Sistema de inventario

Buenas Prácticas

  • Usá get() en vez de [] cuando la clave puede no existir — evita KeyError
  • Claves descriptivas — "precio_unitario" es mejor que "p"
  • copy() para copiar — d2 = d1 crea una referencia, no una copia
  • items() para iterar — es más claro que acceder por clave en un loop
  • Diccionarios vs clases — para estructuras simples usá dict; si el objeto tiene comportamiento, usá clases