web-dev-qa-db-ja.com

Python辞書:TypeError:ハッシュできない型: 'list'

別の辞書からpython辞書を作成するのに問題があります。

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

「ソース」辞書を作成しているのとまったく同じようにターゲット辞書を作成していますが、これが機能しない可能性はありますか?

私は得る

TypeError: unhashable type: 'list'

コード:

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

エラーは次の行にあります:aTargetDictionary[aKey] = []

53
codeJack

あなたが与えたエラーは、Pythonでは辞書キーが不変型でなければならず(キーが変更できる場合は問題がある)、listは可変型であるという事実によるものです。

あなたのエラーは、リストを辞書キーとして使用しようとしています、キーとして配置したい場合は、リストをタプルに変更する必要がありますあなたの辞書に。

python doc によると:

キーとして受け入れられない値のタイプは、リストまたはディクショナリ、またはオブジェクトのアイデンティティではなく値で比較される他の可変タイプを含む値のみです。その理由は、ディクショナリの効率的な実装にはキーのハッシュ値が一定である必要があるためです

46
Cédric Julien

これは確かにかなり奇妙です。

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

これにより、2つの仮説が導き出されます。

  1. 実際に実行しているコードは、質問のコードと同じではありません(おそらく以前のバージョンですか?)

  2. aSourceDictionaryは実際には辞書ではありませんが、他の構造(リストなど)です。

7
NPE

あなたの説明によると、物事は合計されません。 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]}
>>> 
5
ronakg

http://codepad.org/5KgO0b1GaSourceDictionary変数はdict以外のデータ型を持っている可能性があります

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