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')