繁体   English   中英

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

[英]Python: How to compare two lists of dictionaries

伙计们,相对于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'

你需要一个“hashable”字典。

items()属性是元组列表。 使它成为一个tuple() ,你有一个可用的字典版本。

tuple( sorted( some_dict.items() ) )

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

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

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

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}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM