2011-12-16 122 views
35

Tengo problemas para rellenar un diccionario de Python comenzando desde otro diccionario.Python dictionary: TypeError: unhashable type: 'list'

Supongamos que el diccionario "fuente" tiene cadenas como claves y tiene una lista de objetos personalizados por valor.

Estoy creando mi diccionario de destino exactamente como he estado creando mi diccionario "fuente", ¿cómo es posible que esto no funcione?

me sale

TypeError: unhashable type: 'list' 

Código:

aTargetDictionary = {} 
for aKey in aSourceDictionary: 
    aTargetDictionary[aKey] = [] 
    aTargetDictionary[aKey].extend(aSourceDictionary[aKey]) 

El error está en esta línea: aTargetDictionary[aKey] = []

+5

funciona bien en mi terminal. Dé un ejemplo de ** aSourceDictionary ** que está usando –

Respuesta

31

El error que dio es debido al hecho de que en Python, claves del diccionario debe ser tipos inmutables (si la clave puede cambiar, habrá problemas), y la lista es un tipo mutable.

Su error dice que si intenta utilizar una lista como clave de diccionario, tendrá que cambiar su lista en tuplas si desea ponerlas como claves en su diccionario.

Según the python doc:

The only types of values not acceptable as keys are values containing lists or dictionaries or other mutable types that are compared by value rather than by object identity, the reason being that the efficient implementation of dictionaries requires a key’s hash value to remain constant

+1

Pero en este ejemplo, las claves son cadenas (como dice el que pregunta) – 0xc0de

+3

@ 0xc0de: el código dice algo mientras el error dice algo más, confío en el error;) –

+0

Lo intenté y funcionó bien. Usé pequeños nombres de variables. – 0xc0de

7

Este es de hecho bastante extraño.

Si aSourceDictionary fuera un diccionario, no creo que sea posible que su código falle en la manera que usted describe.

Esto lleva a dos hipótesis:

  1. El código en realidad se está ejecutando no es idéntico al código en su pregunta (tal vez una versión anterior o posterior?)

  2. aSourceDictionary es en hecho no es un diccionario, pero es alguna otra estructura (por ejemplo, una lista).

+0

Estoy totalmente de acuerdo –

2

funciona bien: http://codepad.org/5KgO0b1G, la variable de aSourceDictionary puede tener otros tipos de datos que dict

aSourceDictionary = { 'abc' : [1,2,3] , 'ccd' : [4,5] } 
aTargetDictionary = {} 
for aKey in aSourceDictionary: 
     aTargetDictionary[aKey] = [] 
     aTargetDictionary[aKey].extend(aSourceDictionary[aKey]) 
print aTargetDictionary 
3

Según su descripción, las cosas no cuadran. Si aSourceDictionary es un diccionario, entonces su bucle for debe funcionar correctamente.

>>> source = {'a': [1, 2], 'b': [2, 3]} 
>>> target = {} 
>>> for key in source: 
... target[key] = [] 
... target[key].extend(source[key]) 
... 
>>> target 
{'a': [1, 2], 'b': [2, 3]} 
>>> 
Cuestiones relacionadas