簡體   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