繁体   English   中英

类型错误python unhashable类型

[英]type error python unhashable type

我试图得到dict1和dict2之间的区别,但我不断收到错误任何帮助吗?

ret = {}
third_value_list =[0,1]
for i in third_value_list:
    #print i
    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]}

追溯(最近一次通话):

文件“ C:\\ Randstad-ISS \\ workspace \\ pattern2 \\ src \\ pat2 \\ t4.py”,第46行,在

如果set(dict2.items())-set(dict1.items()):TypeError:无法散列的类型:'列表'

{1:[0,0],2:[6,0]}

{1:[0,1],2:[1,1]}

{1:[0,1],2:[6,1]}

为了将对象添加到集合中,它需要是可哈希的 只有不可变的对象才是可dict1并且由于dict1包含可变的列表,因此会出现错误。

从Python文档中:

如果对象的哈希值在其生命周期内始终不变(需要使用hash ()方法),并且可以与其他对象进行比较(需要使用eq ()或cmp ()方法),则该对象是可哈希的。 比较相等的可哈希对象必须具有相同的哈希值。

散列性使对象可用作字典键和set成员,因为这些数据结构在内部使用散列值。

Python的所有不可变内置对象都是可哈希的,而没有可变容器(例如列表或字典)是可哈希的。 作为用户定义类实例的对象默认情况下可哈希化; 它们都比较不相等(除了它们本身),并且它们的哈希值是从其id()派生的。

该错误发生在set(dict2.items()) 您试图将(1, [0,1])(2, [1,1]) (这些是字典中的“项目”)放置到集合中。 要放入集合中,需要对项目进行哈希处理。 无法将它们散列,因为它们包含一个列表。 列表不可哈希,因为它可以更改,列表是可变的。 只能对不可变的对象进行哈希处理。

列表的不可变版本是元组。 元组本质上是一个不能更改的列表。 普通数据类型还有其他不可变版本,例如冻结集而不是集。

将这些列表更改为元组,即可对它们进行哈希处理!

试试这个代码。 主要思想是将dict1和dict2中的[v]+[i]值转换为元组,然后计算dict1和dict2之差。 最后,将元组类型的值转换回list。

ret = {}
third_value_list =[0,1]
for i in third_value_list:
    #print i
    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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM