Lecciones del módulo (3/4)
Diccionarios
Un diccionario (dict) es un mapa clave → valor: asocias una clave
(casi siempre una cadena) con un valor de cualquier tipo. Es la estructura de datos
fundamental para modelar entidades del mundo real.
Crear un diccionario
vuoto = {}
utente = {"nome": "Ada", "anni": 36, "attivo": True}
# constructor alternativo
utente = dict(nome="Ada", anni=36, attivo=True)Las claves deben ser hashables (inmutables): cadenas, números, tuplas de elementos hashables. Los valores, por otro lado, pueden ser cualquier cosa — incluso otros diccionarios.
Acceso, modificación, eliminación
utente["nome"] # 'Ada'
utente["email"] # ¡KeyError!
utente.get("email") # None (valor por defecto seguro)
utente.get("email", "—") # '—' (valor por defecto personalizado)
utente["citta"] = "Roma" # añade / actualiza
del utente["attivo"] # eliminaIterar sobre un diccionario
for chiave in utente: # itera sobre las CLAVES (comportamiento por defecto)
print(chiave, utente[chiave])
for chiave in utente.keys(): # explícito
...
for valore in utente.values():
print(valore)
for chiave, valore in utente.items(): # el idioma más común
print(f"{chiave} = {valore}")El orden de iteración es el orden de inserción (garantizado desde Python 3.7 en adelante).
¿Existe la clave?
"nome" in utente # True
"email" in utente # False (¡NO usa el valor, usa la clave!)setdefault: inicializar en el primer acceso
Un patrón común: "si la clave no existe, pon el valor por defecto; en cualquier caso, devuelve el valor actual".
gruppi = {}
for nome in ["Ada", "Linus", "Ada", "Grace", "Linus", "Ada"]:
gruppi.setdefault(nome, []).append(1)
# {'Ada': [1, 1, 1], 'Linus': [1, 1], 'Grace': [1]}También existe collections.Counter para el caso específico de contar (lo
veremos en el módulo de la biblioteca estándar).
Iterar sobre diccionarios
Puedes iterar sobre un diccionario de varias formas:
for k in d: itera solo sobre las claves (comportamiento por defecto).for k, v in d.items(): itera sobre los pares clave-valor simultáneamente (muy útil).for v in d.values(): itera solo sobre los valores.
Pruébalo tú
Dado `user = {'nome': 'Ada', 'anni': 36}`, añade la clave 'email' = 'ada@ex.com' y luego asigna a `email_or_default` el valor de la clave 'telefono' usando .get con valor por defecto 'sconosciuto'. Evalúa `email_or_default`.
Mostrar pista
.get('telefono', 'sconosciuto') no lanza KeyError.
Solución disponible después de 3 intentos
Ejercicio de repaso
Dado `prices = {'mela': 1.2, 'pera': 1.5, 'kiwi': 2.0}`, calcula la suma de todos los valores y asígnala a `total`. Evalúa `total`.
Mostrar pista
sum(prices.values()) suma todos los valores.
Solución disponible después de 3 intentos
Desafío adicional
Dado el diccionario `user = {'name': 'Alice'}`, usa el método `.get()` para recuperar el valor de la clave `'role'`. Si la clave no existe, haz que devuelva el valor por defecto `'guest'`. Guarda el resultado en `user_role` y evalúalo.
Mostrar pista
El método get acepta un segundo parámetro como alternativa: user.get('role', 'guest').
Solución disponible después de 3 intentos