Historia de la pregunta:
Los diccionarios (dict) son uno de los tipos de datos básicos de Python, representan una estructura de "clave-valor". Los diccionarios han estado presentes desde la primera versión de Python, pero su implementación interna y características de comportamiento han sido perfeccionadas constantemente (por ejemplo, en Python 3.7 se garantiza el orden de inserción).
Problema:
Entender cómo está construido un diccionario es necesario para escribir código de manera eficiente. Sin conocimiento de los detalles, pueden surgir errores al usar tipos mutables como claves, al copiar diccionarios anidados, así como en operaciones no estándar.
Solución:
Un diccionario está implementado como una tabla hash, las claves deben ser necesariamente hashables (inmutables). El acceso a un valor mediante una clave funciona cerca de O(1), pero bajo ciertas condiciones pueden surgir particularidades, por ejemplo, en caso de colisiones o al trabajar con grandes volúmenes de datos.
Ejemplo de código:
person = {'name': 'Alice', 'age': 30} person['city'] = 'Moscú' print(person['name']) # Alice
Características clave:
¿Se puede usar una lista (list) como clave en dict?
No, las listas son mutables y no son hashables. Intentar usar una lista generará un error.
d = {} d[[1, 2, 3]] = 'valor' # TypeError: tipo no hashable: 'list'
¿Qué ocurre si se utilizan dos tuplas con el mismo contenido como clave?
Si ambas tuplas contienen los mismos datos y son inmutables, se consideran iguales y las claves en el diccionario coincidirán:
t1 = (1, 2) t2 = (1, 2) d = {t1: 'a'} print(d[t2]) # 'a'
¿Cambiará el orden de iteración de los elementos del diccionario al copiarlo?
En las versiones de Python 3.7 en adelante, el orden se mantendrá. En versiones anteriores, el orden de iteración no está garantizado.
d1 = {'a': 1, 'b': 2} d2 = dict(d1) print(list(d2)) # ['a', 'b']
dict.get() sin verificar si es None puede llevar a errores inesperados si el valor == None.Un programador almacena listas como claves, pensando erróneamente que las tuplas y las listas son equivalentes como claves en Python. Recibe excepciones del tipo "tipo no hashable".
Ventajas:
Se puede intentar rápidamente algo "sobre la marcha", utilizando cualquier estructura.
Desventajas:
Errores en tiempo de ejecución, bugs en el procesamiento de datos.
Se utilizan solo objetos inmutables (hashables) como claves, las tuplas están diseñadas para no contener elementos mutables.
Ventajas:
Rapidez de búsqueda por clave, fiabilidad de la estructura, fácil procesamiento y copia.
Desventajas:
Si los datos son complejos, se requiere procesamiento adicional para convertir la estructura a una forma inmutable (por ejemplo, serialización dentro de la tupla).