2011-12-16 26 views
35

別の辞書から始まるPython辞書の作成に問題があります。Python辞書:TypeError:unhashable type: 'list'

「ソース」ディクショナリがキーとして文字列を持ち、値ごとにカスタムオブジェクトのリストがあるとします。

"ソース"辞書を作成しているのとまったく同じターゲット辞書を作成していますが、これはどのように動作しないのでしょうか?

私は

TypeError: unhashable type: 'list' 

コードを取得:

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

エラーがこの行にある:あなたが与えたaTargetDictionary[aKey] = []

+5

は端末で正常に動作します。あなたが使用している** aSourceDictionary **の例を挙げてください。 –

答えて

31

エラーがPythonで、辞書のキーがなければならないという事実によるものであるが不変型(キーが変更できる場合は問題があります)、リストは変更可能な型です。

辞書のキーとしてリストを使用しようとすると、リストをタプルに変更する必要があります。 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

この例では、キーは文字列です(質問者の言うとおり) – 0xc0de

+3

@ 0xc0de:エラーが何か他のことを言っている間にコードが何かを言います。 –

+0

私は試して、それは正常に働いた。私は小さなvariablenamesを使用しました。 – 0xc0de

7

これは確かに奇妙です。

aSourceDictionaryが辞書の場合、私はあなたのコードがあなたが記述する方法で失敗する可能性はないと思います。

これは、2つの仮説につながる:

  1. あなたが実際に実行しているコードは、あなたの質問に(?おそらくそれ以前またはそれ以降のバージョン)のコードと同じではない

  2. aSourceDictionaryが入っています実際には辞書ではなく、他の構造(例えば、リスト)です。

+0

私は全く同意します –

2

それは正常に動作します:http://codepad.org/5KgO0b1G、 あなたaSourceDictionary変数は物事がアップ追加しないでください、あなたの説明を1としてdictの

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

以外のデータ型を持っていることがあります。 aSourceDictionaryが辞書の場合、forループは正常に動作している必要があります。

>>> 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]} 
>>>