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

4

大家好,我是一名相对新手的Python开发者,想要找出两个字典列表之间的差异。

如果这些只是普通的列表,我可以创建集合,然后执行“-”/交集操作。

然而,集合操作无法用于字典列表:

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

5
你需要一个“可哈希”的字典。 items() 属性是一个元组的列表。将其转换为 tuple(),就得到了一个可哈希的字典版本。
tuple( sorted( some_dict.items() ) )

OrderedDict不是可哈希的类型。 - Ian B.

0
你可以定义自己的字典包装器,该包装器定义了__hash__方法:
class HashableDict(dict):
    def __hash__(self):
        return hash(tuple(sorted(self.items())))

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


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}

当然,这既不高效也不美观。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接