¿Te resulta más fácil leer con fondo crema, un tono de color, más contraste o un texto más grande? Elige tus colores y tu texto una sola vez, para todas las páginas.

Lección gratuita

Diccionarios y conjuntos: buscar por clave

La lección completa está aquí para leer. Crea una cuenta gratuita para ejecutar sus comandos en un laboratorio y hacer sus cuestionarios y tareas.

Lección de 45 minSin comandos

El precio de la referencia REF-205

Atiendes el teléfono en una ferretería con venta online. Un cliente pregunta el precio de la referencia REF-205.

El catálogo tiene 20 000 productos. Leerlos uno a uno en una lista sería lento.

Con la estructura adecuada, el programa salta directo al producto. Esa estructura es el diccionario.

Al final de esta lección

Nota

Puedo buscar un valor por su clave.

Palabras clave

PalabraQué significaEjemplo
Diccionariopares de clave y valor{"REF-205": 12.90}
Claveel dato con el que buscas, único
Valorel dato que guardas con cada clave
Conjuntovalores sin orden y sin repetidos
Hashun número calculado a partir de la clave

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Un diccionario busca por clave

Un diccionario guarda pares: una clave y su valor. Se escribe entre llaves.

Para leer un valor no usas una posición, usas la clave: prices["REF-205"]. Con la misma forma cambias un valor o añades una clave nueva.

Las claves no se repiten. Si pides una clave que no existe, Python da un KeyError. Por eso se pregunta antes con in.

Prueba: el catálogo de la ferretería

Código: python
# Precio de cada producto por su referencia, en euros.
prices = {"REF-100": 3.50, "REF-205": 12.90, "REF-318": 0.85}

print("Precio de REF-205:", prices["REF-205"])

prices["REF-100"] = 3.75        # sube el precio: se cambia el valor
prices["REF-420"] = 6.20        # producto nuevo: clave nueva
print("Catálogo:", prices)

# Antes de leer, comprueba que la clave existe.
code = "REF-999"
if code in prices:
    print("Precio:", prices[code])
else:
    print("No existe la referencia", code)

# Cambia code por "REF-318" y ejecuta otra vez.

Un conjunto guarda cada valor una vez

Un conjunto guarda valores sin orden y sin repetidos. Si metes el mismo valor dos veces, queda uno.

Sirve para dos trabajos muy comunes. El primero, quitar duplicados de una lista. El segundo, preguntar si un valor ya está, con in.

Por ejemplo: ¿este correo ya está dado de alta en el boletín?

Prueba: clientes distintos

Código: python
# Correos de los clientes que han escrito hoy a soporte.
emails = ["[email protected]", "[email protected]", "[email protected]", "[email protected]"]
print("Mensajes recibidos:", len(emails))

# Un conjunto no guarda repetidos.
customers = set(emails)
print("Clientes distintos:", len(customers))

# in responde enseguida si un valor está.
print("¿Ha escrito luis?", "[email protected]" in customers)
print("¿Ha escrito pablo?", "[email protected]" in customers)

# Añade "[email protected]" a la lista emails y vuelve a ejecutar.

Por qué buscar por clave es rápido

Python no lee todas las claves para encontrar una. Calcula un número a partir de la clave, su hash.

Ese número dice en qué hueco de la memoria está el valor. El programa va directo a ese hueco.

Por eso un diccionario o un conjunto tarda casi lo mismo con 10 elementos que con un millón. Una lista, en cambio, puede tener que mirarlos todos.

Ejemplo resuelto: comparaciones para encontrar una referencia

Productos en el catálogoEn una lista, como muchoEn un diccionario, casi siempre
1010 comparaciones1 cálculo
10001000 comparaciones1 cálculo
20 00020 000 comparaciones1 cálculo

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Un error frecuente

Advertencia

Mucha gente cree que un diccionario se lee por posición, como una lista, con prices[0]. No es así. Un diccionario solo entiende de claves. Si 0 no es una clave, prices[0] da un KeyError. Usa la clave que guardaste.

¿Enseñas a una clase? Asigna este módulo a tus alumnos con guía del profesor, tareas con corrección automática y un laboratorio para cada alumno.