Python字典:类型错误:不可哈希类型:'list'。

65

我在从另一个字典开始填充Python字典方面遇到了麻烦。

假设“源”字典的键为字符串,并且每个值都有自定义对象的列表。

我创建我的目标字典完全与我创建“源”字典的方式相同,为什么不起作用?

我得到:

TypeError: unhashable type: 'list'

代码:

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

出错的地方在这一行:aTargetDictionary[aKey] = []


6
在我的终端上运行良好。请给出您正在使用的 aSourceDictionary 的示例。 - Zain Khan
由于问题的关键方面存在争议且提问者未解决争议,我对此问题进行了负评。令人恼火的是,这个问题在我的谷歌搜索中突然冒出来,可能是因为它的高票数。 - fountainhead
5个回答

65
你给出的错误是由于在Python中,字典键必须是不可变类型(如果键可以改变,就会出现问题),而列表是可变类型导致的。
你的错误提示说你尝试将一个列表用作字典键,如果你想把它们作为字典键,你就需要将它们转换成元组
根据Python官方文档的描述:

唯一不被接受作为键的值是包含列表、字典或其他被值比较而不是对象标识比较的可变类型的值,原因是字典的高效实现要求键的哈希值保持恒定。


1
但在这个例子中,键是字符串(正如提问者所说)。 - 0xc0de
3
@0xc0de:代码说了一些东西,而错误提示说了另外一些东西,我更相信错误提示 ;) - Cédric Julien
@0xc0de:我们同意,所有答案都在说同一件事,OP展示的代码有效,但他仍然有错误,我只是试图解释错误的原因。 - Cédric Julien
codeJack:您确定键是字符串吗?您的错误提示是“NO”! - 0xc0de
在Python中,@0xc0de字符串是不可变的:[问Guido](https://docs.python.org/2/faq/design.html#why-are-python-strings-immutable) - Razi Shaban
看起来OP正在使用字符串的单例列表作为新字典中的键。因此需要将新键转换为元组。 - Reb.Cabin

6

这确实很奇怪。

如果aSourceDictionary是一个字典,我不相信你的代码会以你描述的方式失败。

这导致有两种假设:

  1. 实际运行的代码与您问题中的代码不同(可能是早期或晚期版本?)

  2. aSourceDictionary实际上不是一个字典,而是某些其他结构(例如列表)。


5
根据您的描述,事情似乎不太对劲。如果 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]}
>>> 

2

它运行良好:http://codepad.org/5KgO0b1G, 你的aSourceDictionary变量可能具有字典以外的其他数据类型。

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

0

你也可以使用defaultdict来解决这种情况。用法大致如下:

from collections import defaultdict

#initialises the dictionary with values as list
aTargetDictionary = defaultdict(list)

for aKey in aSourceDictionary:
    aTargetDictionary[aKey].append(aSourceDictionary[aKey])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接