类型错误:python不可哈希类型
类型错误:python不可哈希类型
我正在尝试获取dict1和dict2之间的差异,但我一直遇到错误。有人可以帮忙吗?
代码:
ret = {}
third_value_list =[0,1]
for i in third_value_list:
num_list = [1,2]
val_list = [0,1]
dict1 = dict((k, [v]+[i]) for (k, v) in zip(num_list,val_list))
print dict1
num_list2= [1,2]
val_list2 = [0,6]
dict2 = dict((k, [v]+[i]) for (k, v) in zip(num_list2,val_list2))
print dict2
if set(dict2.items()) - set(dict1.items()):
print 'true'
a = set(dict1.items()) - set(dict2.items())
ret.update (a)
print ret
输出:
{1: [0, 0], 2: [1, 0]}
Traceback (most recent call last):
File "C:\Randstad-ISS\workspace\pattern2\src\pat2\t4.py", line 46,in
if set(dict2.items()) - set(dict1.items()):TypeError: unhashable type: 'list'
{1: [0, 0], 2: [6, 0]}
{1: [0, 1], 2: [1, 1]}
{1: [0, 1], 2: [6, 1]}
在Python中,要将对象添加到集合中,该对象需要是可哈希的。只有不可变的对象才是可哈希的,而由于`dict1`包含可变的列表,因此会出现错误。
根据Python文档的解释:
"如果一个对象具有在其生命周期内永远不会改变的哈希值(需要一个`hash()`方法),并且可以与其他对象进行比较(需要一个`eq()`或`cmp()`方法),则该对象是可哈希的。在哈希值相等的情况下,可哈希的对象必须具有相同的哈希值。
哈希性使对象可用作字典键和集合成员,因为这些数据结构在内部使用哈希值。
Python中的所有不可变内置对象都是可哈希的,而没有可变容器(如列表或字典)是可哈希的。默认情况下,用户定义的类的实例对象也是可哈希的;它们都不相等(除非与自身比较),并且它们的哈希值是根据其id()派生的。"
因此,出现"(type error python unhashable type)"错误的原因是`dict1`包含可变的列表,而可变容器是不可哈希的。
要解决这个问题,我们需要确保将可哈希的对象添加到集合中。如果`dict1`中的列表是可变的,并且我们需要将其作为集合的成员,则可以将其转换为元组。元组是不可变的,因此可以被哈希。
以下是解决方法的示例代码:
dict1 = {'key1': [1, 2, 3], 'key2': [4, 5, 6]} dict1['key1'] = tuple(dict1['key1'])
在上面的代码中,我们将`dict1`中的`key1`的值从列表转换为元组,以便可以将其添加到集合中。
通过将列表转换为元组,我们解决了"(type error python unhashable type)"错误,因为现在我们可以将`dict1`添加到集合中了。
在代码中的set(dict2.items())
出现了(type error python unhashable type)这个错误。你试图将(1, [0,1])
和(2, [1,1])
(这些是字典中的"items")放入一个集合中。为了放入集合中,这些元素需要被哈希。它们无法被哈希,因为其中包含一个列表。列表是不可哈希的,因为它可以被修改,列表是可变的。只有不可变对象才能被哈希。
列表的不可变版本是元组。元组本质上是一个不能被修改的列表。还有其他常见数据类型的不可变版本,比如用frozensets代替sets。
将这些列表改为元组,你就可以进行哈希操作了!但是,如果我改成元组后,如何找到它们之间的差异呢?
你的意思是"找到它们之间的差异"是什么意思?
dict2 = tuple((k, [v]+[i]) for (k, v) in zip(num_list2,val_list2))
if set(dict2.items()) - set(dict1.items()):
我不能使用set,如果我改成元组的话。
哦,好的,我明白你的意思了。dict1 应该保持为字典。相反,你应该将字典的"值"部分改为列表。像这样:dict1 = dict((k, tuple([v]+[i])) for (k, v) in zip(num_list,val_list))
在这段代码中,出现了(type error python unhashable type)的错误。这个错误的原因是在字典(dict)中,不能使用可变的数据类型作为键(key)。在代码的第11行和第14行,将[v]+[i]转换为元组(tuple)类型,并将其作为字典的值(value)。然而,元组是可变的,因此不能作为字典的键。
要解决这个问题,我们需要将元组转换回列表(list)类型。在代码的第13行和第16行,通过使用列表推导式(list comprehension),将元组中的值提取出来并放入一个新的列表中。这样,我们就可以将列表作为字典的值,而不会出现(type error python unhashable type)的错误。
以下是修改后的代码:
ret = {} third_value_list = [0, 1] for i in third_value_list: num_list = [1, 2] val_list = [0, 1] dict1 = dict((k, tuple([v]+[i])) for (k, v) in zip(num_list, val_list)) print(dict1) num_list2 = [1, 2] val_list2 = [0, 6] dict2 = dict((k, tuple([v]+[i])) for (k, v) in zip(num_list2, val_list2)) print(dict2) if set(dict2.items()) - set(dict1.items()): print('true') a = dict(set(dict1.items()) - set(dict2.items())) a = dict((k, [i for i in v]) for (k, v) in zip(a.keys(), a.values())) ret.update(a) print(ret)
通过将元组转换为列表,我们成功地解决了(type error python unhashable type)的问题。