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
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Diccionario | pares de clave y valor | {"REF-205": 12.90} |
| Clave | el dato con el que buscas, único | |
| Valor | el dato que guardas con cada clave | |
| Conjunto | valores sin orden y sin repetidos | |
| Hash | un 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
# 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
# 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álogo | En una lista, como mucho | En un diccionario, casi siempre |
|---|---|---|
| 10 | 10 comparaciones | 1 cálculo |
| 1000 | 1000 comparaciones | 1 cálculo |
| 20 000 | 20 000 comparaciones | 1 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.