Estructuras de datos · #8 de 11

Diccionarios

Mapeo clave-valor, métodos e internos

Por qué importa

Las tablas hash resuelven una enorme clase de problemas en tiempo O(1) promedio.

La idea

Un dict es una tabla de búsqueda rápida: clave → valor. Las claves deben ser hashables (es decir: cadenas, números, tuplas; no listas). Desde Python 3.7, los diccionarios recuerdan el orden de inserción.

Pruébalo

Construir, buscar, valores por defecto:

prices = {"apple": 1.0, "banana": 0.5}
prices["cherry"] = 2.5
print(prices)

# .get() returns a default instead of raising KeyError
print(prices.get("grape", 0.0))

# setdefault() inserts if missing, then returns the value
prices.setdefault("date", 3.0)
print(prices)
not loaded

Conteo: el clásico modismo de "frecuencia":

from collections import Counter

text = "mississippi"
counts = Counter(text)
print(counts)
print(counts.most_common(2))
not loaded

Iteración: items() produce tuplas (clave, valor), perfectas para desempaquetar.

scores = {"Ada": 95, "Linus": 88, "Margaret": 99}
for name, score in scores.items():
  print(f"{name:>10}: {score}")

# Dict comprehension
inverted = { score: name for name, score in scores.items() }
print(inverted)
not loaded

Métodos principales de dict (debes conocerlos)

| Método | Qué hace | Ejemplo | | --- | --- | --- | | get(k, d) | búsqueda segura | d.get("x", 0) | | keys() | vista de las claves | list(d.keys()) | | values() | vista de los valores | list(d.values()) | | items() | vista de los pares | list(d.items()) | | update(...) | fusionar/actualizar | d.update({"x":1}) | | pop(k) | quitar una clave | d.pop("x") | | popitem() | quitar el último par | d.popitem() | | setdefault(k, d) | obtener o asignar | d.setdefault("x", 0) | | copy() | copia superficial | d.copy() | | fromkeys(keys, v) | inicializar | dict.fromkeys(keys, 0) |

Patrón de agrupación

setdefault convierte "agrupar elementos por una clave" en una sola línea:

groups = {}
for item in items:
    groups.setdefault(item[0], []).append(item)

Patrón Two Sum

El truco hash canónico de "recuerda lo que has visto": O(n) en lugar de O(n²):

def two_sum(nums, target):
    seen = {}
    for i, x in enumerate(nums):
        need = target - x
        if need in seen:
            return [seen[need], i]
        seen[x] = i

Verificación rápida

Mini ejercicios

Buenas y malas prácticas

Profundizando — cómo funcionan los diccionarios

Internos de la tabla hash

  • Tabla hash: las claves se hashean a un índice de la tabla.
  • Colisiones: distintas claves pueden mapear al mismo índice.
  • Resolución: CPython usa direccionamiento abierto con sondeo (rápido en promedio).
  • Factor de carga: a medida que la tabla se llena, Python la redimensiona para mantener rápidas las búsquedas.

Reglas de hashabilidad

  • Hashables: int, float, str, tuple (si sus elementos son hashables), frozenset.
  • No hashables: list, dict, set.

Garantía de orden

  • Python 3.7+ preserva el orden de inserción (una garantía oficial del lenguaje).

Errores comunes

Conclusiones clave