[英]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.