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

65 投票
5 回答
189579 浏览
提问于 2025-04-17 08:29

我在用一个字典来填充另一个字典时遇到了麻烦。

假设“源”字典的键是字符串,每个键对应的值是一个自定义对象的列表。

我在创建目标字典时,完全按照创建“源”字典的方式来做,为什么这不管用呢?

我遇到了这个问题:

TypeError: unhashable type: 'list'

代码:

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

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

5 个回答

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

这确实有点奇怪。

如果 aSourceDictionary 是一个字典,我觉得你的代码不可能出现你描述的那种错误。

这就引出了两个猜想:

  1. 你实际运行的代码和你提问时的代码不完全一样(可能是早期版本或后期版本?)

  2. aSourceDictionary 实际上并不是一个字典,而是其他类型的结构(比如一个列表)。

65

你遇到的错误是因为在Python中,字典的键必须是不可变类型(如果键可以改变,就会出现问题),而列表是可变类型。

你的错误提示是说你试图用一个列表作为字典的键,如果想把它们作为字典的键,你需要把列表转换成元组

根据Python文档

唯一不可以作为键的值是包含列表或字典或其他可变类型的值,因为这些值是通过内容比较而不是对象身份比较的,原因是字典的高效实现需要键的哈希值保持不变。

撰写回答