Una de las estructuras de datos básicos en Python es el diccionario, que permite grabar "claves" para buscar "valores" de cualquier tipo. ¿Esto se implementa internamente como una tabla hash? Si no, ¿qué es?¿Es un diccionario de Python un ejemplo de una tabla hash?
Respuesta
Sí, es un mapeo hash o una tabla hash. Puede leer una descripción de la implementación del dict de Python, según lo escrito por Tim Peters, here.
Es por eso que no se puede usar algo 'no hashable' como clave dict, como una lista:
>>> a = {}
>>> b = ['some', 'list']
>>> hash(b)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: list objects are unhashable
>>> a[b] = 'some'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: list objects are unhashable
Puede read more about hash tables o check how it has been implemented in python y why it is implemented that way.
El enlace de Tim Peters parece estar roto, ¿hay un enlace limpio por ahí? –
@MattAlcock: He actualizado el enlace. Algunas veces (generalmente debido a que alguien quiere que su dirección de correo electrónico sea eliminada en alguna parte), los archivos de la lista python se reconstruyen y los identificadores de correos electrónicos cambian, rompiendo así estos enlaces. Los administradores de pydotorg generalmente intentan evitar eso en estos días. –
Pero el uso de '.keys()' puede recuperar una lista de claves. Una tabla hash real no almacenaría claves, solo hashes para ahorrar espacio. –
Sí. Internamente se implementa como hash abierto basado en un polinomio primitivo sobre Z/2 (source).
Si está interesado en los detalles técnicos, un artículo en Beautiful Code se ocupa de los aspectos internos de la implementación de Python dict
.
Ese fue uno de mis capítulos favoritos en Beautiful Code. – DGentry
de ampliar la explicación de nosklo:
a = {}
b = ['some', 'list']
a[b] = 'some' # this won't work
a[tuple(b)] = 'some' # this will, same as a['some', 'list']
Debe haber más de un diccionario de Python que una búsqueda en la tabla de hash de(). Por experimentación bruta encontré este hash de colisión:
>>> hash(1.1)
2040142438
>>> hash(4504.1)
2040142438
Sin embargo, no se rompe el diccionario:
>>> d = { 1.1: 'a', 4504.1: 'b' }
>>> d[1.1]
'a'
>>> d[4504.1]
'b'
cordura cheque:
>>> for k,v in d.items(): print(hash(k))
2040142438
2040142438
Posiblemente hay otro nivel de búsqueda más allá hash() que evita las colisiones entre las teclas del diccionario. O tal vez dict() usa un hash diferente.
(Por cierto, esto en Python 2.7.10. La misma historia en Python 3.4.3 y 3.5.0 con una colisión en hash(1.1) == hash(214748749.8)
.)
Tiene soluciones para colisiones. –
Utiliza '__eq__' para resolver colisiones. – dmitry
Entonces las colisiones son inevitables. El conjunto S puede contener un número infinitamente grande de elementos, y usted quiere hacer un hash con un número que una computadora puede almacenar. Cada implementación utilizable de una tabla hash resuelve colisiones, con dos de los métodos más frecuentes son a) direccionamiento abierto yb) encadenamiento. El hecho de que no utilice un hash perfecto no significa que no sea una tabla hash. – TurnipEntropy
- 1. BeautifulSoup, un diccionario de una tabla HTML
- 2. Diseño de tabla hash Python
- 3. ¿Traducir una tabla a un diccionario jerárquico?
- 4. Poblando un diccionario de Python
- 5. ¿Cómo crear una tabla de diccionario/hash al iterar a través de una columna?
- 6. ¿Cómo funcionan las búsquedas de hash de diccionario de Python?
- 7. ¿Es el diccionario ActionScript 3 un hashmap?
- 8. Mapa hash C/C++ de super alto rendimiento (tabla, diccionario)
- 9. colisiones recuento en un diccionario de Python
- 10. ¿Usando una tabla hash dentro de un Parallel.ForEach?
- 11. ¿Cómo analizar este ejemplo hash de hash?
- 12. Uniendo un diccionario a una tabla de datos
- 13. Construyendo una función hash/tabla hash
- 14. ¿Es posible ordenar una tabla Hash?
- 15. Python iterar sobre un diccionario
- 16. Python creando un diccionario de listas
- 17. Elección de un tamaño de tabla adecuado para un hash
- 18. Python: ordenando un diccionario de listas
- 19. ¿Qué es un ataque de diccionario?
- 20. ¿Qué algoritmo hash utiliza el mapeo del diccionario de Python?
- 21. Consigue un subconjunto de un diccionario de Python
- 22. ¿Qué es un ejemplo de implementación de Hashtable en C#?
- 23. Python: ¿Podemos convertir una estructura de ctypes en un diccionario?
- 24. el modo de hacer un diccionario Python como una tabla HTML con columnas verticales
- 25. Mapeo de valores en un diccionario Python
- 26. Crear un diccionario con una lista de listas en Python
- 27. Ordenando un diccionario de tuplas en Python
- 28. Cargando un gran diccionario de Python Pickle
- 29. ¿Atajo de teclas Python en un diccionario?
- 30. ¿Cómo serializo JSON un diccionario de Python?
Aquí es una charla de Brandon Craig Rodas discutir cómo funciona diccionario de Python , https://www.youtube.com/watch?v=C4Kc8xzcA68. – chandola