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

4 投票
3 回答
4670 浏览
提问于 2025-04-16 16:24

大家好,

我对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 个回答

0

你可以自己定义一个字典的包装器,并在里面定义一个叫做 __hash__ 的方法:

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

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

0

Python不允许你把字典用作集合或字典的键,因为字典没有默认的__hash__方法。很遗憾,collections.OrderedDict也是不能被哈希的。并且,没有一个内置的字典可以和frozenset相对应。你可以创建一个字典的子类,并自己定义一个哈希方法,或者像这样做:

>>> 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}

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

5

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

items()这个属性会返回一个包含元组的列表。把这个转换成tuple(),你就得到了一个可以哈希的字典版本。

tuple( sorted( some_dict.items() ) )

撰写回答