resueltos - recorrer diccionario python
¿Por qué no puedo usar una lista como clave dict en python? (7)
Aquí hay una respuesta http://wiki.python.org/moin/DictionaryKeys
¿Qué iría mal si intentaras usar listas como claves, con el hash como, por ejemplo, su ubicación de memoria?
Buscar listas diferentes con los mismos contenidos produciría resultados diferentes, aunque comparar listas con los mismos contenidos indicaría que son equivalentes.
¿Qué tal usar un literal de lista en una búsqueda de diccionario?
Estoy un poco confundido sobre lo que puede / no puede usarse como clave para un dict de Python.
dicked = {}
dicked[None] = ''foo'' # None ok
dicked[(1,3)] = ''baz'' # tuple ok
import sys
dicked[sys] = ''bar'' # wow, even a module is ok !
dicked[(1,[3])] = ''qux'' # oops, not allowed
Entonces una tupla es un tipo inmutable, pero si oculto una lista dentro de ella, entonces no puede ser una clave ... ¿no podría esconder tan fácilmente una lista dentro de un módulo?
Tenía una vaga idea de que la clave tiene que ser "manejable", pero voy a admitir mi propia ignorancia sobre los detalles técnicos; No sé qué está pasando realmente aquí. ¿Qué iría mal si intentaras usar listas como claves, con el hash como, por ejemplo, su ubicación de memoria?
De acuerdo con la documentación de Python 2.7.2:
Un objeto es manejable si tiene un valor hash que nunca cambia durante su vida útil (necesita un método hash ()), y se puede comparar con otros objetos (necesita un método eq () o cmp ()). Los objetos que se pueden comparar y que son iguales deben tener el mismo valor hash.
La capacidad de acceso hace que un objeto se pueda utilizar como una clave de diccionario y un miembro del conjunto, porque estas estructuras de datos usan el valor de hash internamente.
Todos los objetos incorporados inmutables de Python son lavables, mientras que no hay contenedores mutables (como listas o diccionarios). Los objetos que son instancias de clases definidas por el usuario son manejables por defecto; todos ellos comparan desigual, y su valor hash es su id ().
Una tupla es inmutable en el sentido de que no puede agregar, quitar o reemplazar sus elementos, pero los elementos en sí mismos pueden ser mutables. El valor hash de la lista depende de los valores hash de sus elementos, por lo que cambia cuando cambia los elementos.
El uso de identificadores para los hash de la lista implicaría que todas las listas se comparan de manera diferente, lo que sería sorprendente e inconveniente.
El problema es que las tuplas son inmutables y las listas no. Considera lo siguiente
d = {}
li = [1,2,3]
d[li] = 5
li.append(4)
¿Qué debería d[li]
devolver? ¿Es la misma lista? ¿Qué tal d[[1,2,3]]
? Tiene los mismos valores, pero ¿es una lista diferente?
En definitiva, no hay una respuesta satisfactoria. Por ejemplo, si la única clave que funciona es la clave original, entonces si no tiene referencia a esa tecla, nunca más podrá acceder al valor. Con cada otra tecla permitida, puede construir una clave sin una referencia al original.
Si mis dos sugerencias funcionan, entonces tiene claves muy diferentes que devuelven el mismo valor, lo que es más que un poco sorprendente. Si solo funciona el contenido original, la clave se estropeará rápidamente, ya que las listas se crean para ser modificadas.
Hay un buen artículo sobre el tema en la wiki de Python: por qué las listas no pueden ser claves del diccionario . Como se explica allí:
¿Qué iría mal si intentaras usar listas como claves, con el hash como, por ejemplo, su ubicación de memoria?
Se puede hacer sin realmente romper ninguno de los requisitos, pero conduce a un comportamiento inesperado. Por lo general, las listas se tratan como si su valor se derivara de los valores de su contenido, por ejemplo, al verificar (in-) igualdad. Muchos, comprensiblemente, esperan que pueda usar cualquier lista [1, 2]
para obtener la misma clave, donde tendría que mantener exactamente el mismo objeto de la lista. Pero buscar rupturas de valor tan pronto como una lista utilizada como clave se modifique, y para la búsqueda por identidad requiere que se mantenga exactamente en la misma lista, lo cual no es necesario para ninguna otra operación de lista común (al menos no se me ocurre ninguna )
Otros objetos, como módulos y object
hacen mucho más difícil su identidad de objeto (¿cuándo fue la última vez que tuvo dos objetos de módulo distintos llamados sys
?), Y de todos modos se comparan. Por lo tanto, es menos sorprendente, o incluso esperado, que ellos, cuando se usan como claves dict, también puedan comparar por identidad en ese caso.
La respuesta simple a su pregunta es que la lista de clases no implementa el método hash que se requiere para cualquier objeto que desee ser utilizado como clave en un diccionario. Sin embargo, la razón por la que el hash no se implementa de la misma manera que en la clase de tupla (según el contenido del contenedor) es porque una lista es mutable, por lo que la edición de la lista requerirá recalcular el hash, lo que puede significar que la lista ahora ubicado en el cubo incorrecto dentro de la tabla hash subyacente. Tenga en cuenta que dado que no puede modificar una tupla (inmutable), no se encuentra con este problema.
Como nota al margen, la implementación real de la búsqueda de objetos dicto está basada en el algoritmo D de Knuth Vol. 3, Sec. 6.4. Si tiene ese libro disponible, podría ser una lectura que vale la pena, además, si realmente está interesado, puede echar un vistazo a los comentarios de los desarrolladores sobre la implementación real de dictobject aquí. Explica detalladamente cómo funciona exactamente. También hay una conferencia de Python sobre la implementación de diccionarios en la que puede estar interesado. Pasan por la definición de una clave y lo que es un hash en los primeros minutos.
Su respuesta se puede encontrar aquí:
Por qué las listas no pueden ser claves del diccionario
Los recién llegados a Python a menudo se preguntan por qué, si bien el lenguaje incluye tanto una tupla como un tipo de lista, las tuplas se pueden usar como claves de diccionario, mientras que las listas no lo son. Esta fue una decisión de diseño deliberada, y se puede explicar mejor si primero se entiende cómo funcionan los diccionarios de Python.
Fuente y más información: http://wiki.python.org/moin/DictionaryKeys
¿Por qué no puedo usar una lista como clave dict en python?
>>> d = {repr([1,2,3]): ''value''}
{''[1, 2, 3]'': ''value''}
(para cualquiera que tropieza con esta pregunta buscando una forma de evitarlo)
como explicaron otros aquí, de hecho no puedes. Sin embargo, puede utilizar su representación de cadena si realmente desea usar su lista.