Python字典:TypeError:不可散列的类型:'list'

Posted

技术标签:

【中文标题】Python字典:TypeError:不可散列的类型:\'list\'【英文标题】:Python dictionary : TypeError: unhashable type: 'list'Python字典:TypeError:不可散列的类型:'list' 【发布时间】:2012-01-21 20:39:12 【问题描述】:

我在从另一个字典开始填充 python 字典时遇到了麻烦。

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

我正在创建我的目标字典,就像我创建“源”字典一样,这怎么可能不起作用?

我明白了

TypeError: unhashable type: 'list'

代码:

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

错误在这一行:aTargetDictionary[aKey] = []

【问题讨论】:

在我的终端上运行良好。举一个你正在使用的 aSourceDictionary 的例子 否决了这个问题,因为该问题的关键方面存在争议,并且 OP 尚未解决争议。这个问题烦人地出现在我的谷歌搜索中,大概是因为它的投票数很高。 【参考方案1】:

你给出的错误是由于在python中,字典键必须是不可变类型(如果key可以改变,就会出现问题),而list是可变类型。

您的错误表明您尝试使用列表作为字典键,如果您想将列表作为键放入字典中,则必须将列表更改为元组。

根据the python doc:

唯一不能作为键接受的值类型是包含 比较的列表或字典或其他可变类型 值而不是对象身份,原因是 字典的高效实现需要一个键的哈希值 保持不变

【讨论】:

但是在这个例子中,键是字符串(正如提问者所说) @0xc0de :代码说明了一些内容,而错误说明了其他内容,我相信错误;) @0xc0de :我们同意,所有的答案都在说同样的事情,OP显示的代码有效,但他仍然有错误,我只是试图解释错误的原因。跨度> :真的! codeJack:你确定键是字符串吗?你的错误说“不”! @0xc0de 在 python 字符串中是不可变的:ask Guido【参考方案2】:

这确实很奇怪。

如果aSourceDictionary 是一本字典,我认为您的代码不可能以您描述的方式失败。

这导致了两个假设:

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

    aSourceDictionary 实际上不是字典,而是某种其他结构(例如,列表)。

【讨论】:

【参考方案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]
>>> 

【讨论】:

【参考方案4】:

它工作正常:http://codepad.org/5KgO0b1G, 您的 aSourceDictionary 变量可能具有除 dict 以外的其他数据类型

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

【讨论】:

【参考方案5】:

您也可以使用 defaultdict 来解决这种情况。它是这样的:

from collections import defaultdict

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

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

【讨论】:

以上是关于Python字典:TypeError:不可散列的类型:'list'的主要内容,如果未能解决你的问题,请参考以下文章

TypeError:使用一组 UDT 创建 Cassandra Python 驱动程序模型时不可散列的类型 UserType

TypeError:张量是不可散列的。相反,使用 tensor.ref() 作为键。在 Keras 外科医生

如何在其上制作一个简单的 Django URLconf 和 reverse() 进行测试? (获取TypeError:不可散列的类型:'list')

是啥让用户定义的类不可散列?

字典和集合

nltk 的朴素基分类器给出不可散列的类型错误