2011-04-25 71 views
3

Folks, 相對n00b python,試圖找出兩個詞典列表的差異。Python:如何比較兩個詞典列表

如果這些只是常規列表,我可以創建集合然後執行' - '/ intersect操作。

然而,設定操作不會對字典的名單工作:

>>> l = [] 
>>> pool1 = {} 
>>> l.append(pool1) 
>>> s = set(l) 
Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
TypeError: unhashable type: 'dict' 

回答

5

你需要一個「哈希的」字典。

items()屬性是元組列表。做這個tuple(),你有一個字典的可排版版本。

tuple(sorted(some_dict.items())) 
+0

'OrderedDict'是*不*可哈希類型。 – 2011-05-04 15:39:19

0

您可以定義自己的字典包裝定義__hash__方法:

class HashableDict(dict): 
    def __hash__(self): 
     return hash(tuple(sorted(self.items()))) 

這個包裝是安全的,只要你不修改字典也同時找到了交集。

0

由於Python沒有默認的__hash__方法定義,因此Python不允許將字典用作集或字典中的鍵。不幸的是,collections.OrderedDict也不可拆分。也沒有一個內置的字典模擬frozenset。您可以創建dict一個子類,用自己的散列法,或做這樣的事情:

>>> def dict_item_set(dict_list): 
... return set(tuple(*sorted(d.items())) for d in dict_list) 
>>> a = [{1:2}, {3:4}] 
>>> b = [{3:4}, {5:6}] 
>>> dict(dict_item_set(a) - dict_item_set(b)) 
{1: 2} 
>>> dict(dict_item_set(a) & dict_item_set(b)) 
{3: 4}

當然,這既沒有效率,也不漂亮。