How do I avoid a "TypeError: unhashable type: 'dict'" when computing list differences?
How do I avoid a "TypeError: unhashable type: 'dict'" when computing list differences?
我正在使用 Python 3.8。我有两个列表,每个元素都是一个字典 ...
>>> existing_dicts = [{"id": 1}, {"id": 2}]
>>> cur_dicts = [{"id": 2}]
我想找到原来在“existing_dicts”中但不再在“cur_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'
执行此操作的更好方法是什么?
set 方法不起作用,因为您的字典元素是列表。好像不能把字典的列表变成集合。
相反,您可以使用列表理解来检查列表 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)
我正在使用 Python 3.8。我有两个列表,每个元素都是一个字典 ...
>>> existing_dicts = [{"id": 1}, {"id": 2}]
>>> cur_dicts = [{"id": 2}]
我想找到原来在“existing_dicts”中但不再在“cur_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'
执行此操作的更好方法是什么?
set 方法不起作用,因为您的字典元素是列表。好像不能把字典的列表变成集合。
相反,您可以使用列表理解来检查列表 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)