民间, 相对于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'
答案 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}
当然,这既不高效又不漂亮。