计算列表差异时,如何避免出现“ TypeError:无法散列的类型:'dict'”?

时间:2020-11-06 21:22:17

标签: python-3.x list dictionary set-operations

我正在使用Python 3.8。我有两个列表,每个元素都是字典...

>>> existing_dicts = [{"id": 1}, {"id": 2}]
>>> cur_dicts = [{"id": 2}]

我想找到不再存在于“ cur_dicts”中的,原本存在于“ existing_dicts”中的字典。因此,在上面的示例中,

{"id": 1}

是我想要的结果,因为它在“ existing_dicts”中,而不在“ cur_dicts”中。我尝试了以下方法来找到区别...

>>> deleted_dicts = list(set(existing_dicts) - set(cur_dicts))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'dict'

有什么更好的方法?

1 个答案:

答案 0 :(得分:1)

由于列表的字典元素,因此设置方法不起作用。似乎不允许将字典列表变成集合。

相反,您可以使用列表推导来检查列表existing_dict中的任何元素是否在cur_dicts中,

 deleted_dicts = [x for x in existing_dicts if not (x in cur_dicts)]

如果字典不在cur_dicts中,则会将其添加到deleted_dicts中。这取决于可以使用==运算符比较字典是否相等的事实。

完整的示例,扩展了重复的条目和更大的词典:

existing_dicts = [{"id": 1}, {"id": 2}, {"id": 2}, {"id": 2, "id2" : 3}, {"id": 1, "id2": 2}]
cur_dicts = [{"id": 2}, {"id": 1, "id2": 2}]

deleted_dicts = [x for x in existing_dicts if not (x in cur_dicts)]
print(deleted_dicts)