2011-12-16 13 views
35

Mam problemy z zapełnianiem słownika Pythona, zaczynając od innego słownika.Słownik w języku Python: TypeError: unhashable type: 'list'

Załóżmy, że słownik "źródłowy" ma ciąg znaków jako klucze i ma listę niestandardowych obiektów na wartość.

Tworzę słownik docelowy dokładnie tak, jak ja tworzyłem słownik "źródła", jak to możliwe, że to nie działa?

uzyskać

TypeError: unhashable type: 'list' 

Kod:

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

Błąd znajduje się na tej linii: aTargetDictionary[aKey] = []

+5

działa dobrze na moim terminalu. Podaj przykład ** aSourceDictionary **, którego używasz –

Odpowiedz

31

Błąd daliście jest ze względu na fakt, że w Pythonie, klucze słownika musi być niezmiennymi typami (jeśli klucz może się zmienić, pojawią się problemy), a lista jest zmiennym typem.

Twój błąd oznacza, że ​​próbujesz użyć listy jako klucza słownika, musisz zmienić listę na krotki, jeśli chcesz umieścić je jako klucze w słowniku.

Według 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

Ale w tym przykładzie klucze są ciągami znaków (jak mówi pytający) – 0xc0de

+3

@ 0xc0de: kod mówi coś, gdy błąd mówi coś innego, ufam błędowi;) –

+0

Próbowałem i wszystko działało dobrze. Użyłem małych variablenames. – 0xc0de

7

To rzeczywiście dość dziwne.

Jeśli aSourceDictionary był słownikiem, nie sądzę, aby Twój kod mógł zawieść w sposób opisany przez Ciebie.

Prowadzi to do dwóch hipotez:

  1. Kod jesteś rzeczywiście działa nie jest identyczny z kodem w swoje pytanie (być może wcześniej czy później wersja?)

  2. aSourceDictionary jest w nie jest to słownik, ale jest to jakaś inna struktura (na przykład lista).

+0

Całkowicie się zgadzam –

2

Współpracuje: http://codepad.org/5KgO0b1G, zmienna aSourceDictionary może mieć inny typ danych niż dict

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

jak na swój opis, rzeczy nie sumują się. Jeśli aSourceDictionary jest słownikiem, pętla for musi działać poprawnie.

>>> 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]} 
>>> 
Powiązane problemy