[英]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.