类型错误:python不可哈希类型

6 浏览
0 Comments

类型错误: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]}

0
0 Comments

在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`添加到集合中了。

0
0 Comments

在代码中的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))

0
0 Comments

在这段代码中,出现了(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)的问题。

0