Python:如何比较两个字典列表
大家好,
我对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() ) )