Python:如何比较两个词典列表

时间:2011-04-25 22:00:48

标签: python

民间, 相对于python的n00b,试图找出两个字典列表的差异。

如果这些只是常规列表,我可以创建集合,然后执行' - '/ intersect操作。

但是,set操作不适用于词典列表:

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

3 个答案:

答案 0 :(得分:5)

你需要一个“可以”的字典。

items()属性是元组列表。将其设为tuple(),您就拥有了可用的字典版本。

tuple( sorted( some_dict.items() ) )

答案 1 :(得分:0)

您可以定义自己的dict包装器,用于定义__hash__方法:

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

只要在查找交集时不修改字典,此包装器就是安全的。

答案 2 :(得分:0)

Python不允许您将字典用作集合或字典中的键,因为它没有定义默认的__hash__方法。不幸的是,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}

当然,这既不高效又不漂亮。