我有两个词典
x = {0:[1,2,3], 1:[1,2,3], 2:[1,2,3]}
y = {0:[1,2,3], 1:[1,2,3], 2:[1,2,3]}
我需要检查这两个词典的相似性。我正在使用以下代码
shared_items = set(x.items()) & set(y.items())
但它给了我
TypeError: unhashable type: 'list'
错误。
此问题的原因是什么以及如何纠正。
答案 0 :(得分:5)
set
不能包含不可散列的对象,因为它使用散列进行项目查找。由于您的list
值是可变的,因此在set
中添加这些值会引发错误。
您需要改为使用tuple
值。
x = {1: (1, 2, 3), 2: (1, 2, 3)}
y = {0: (1, 2, 3), 1: (1, 2, 3)}
shared_items = set(x.items()) & set(y.items())
# shared_items: {(1, (1, 2, 3))}
尽管由于允许dict
中的值是可变的,但您可能希望找到另一种数据结构以获得更通用的解决方案。以下内容将返回dict
个共享键值对。
x = {1: [1, 2, 3], 2: [1, 2, 3]}
y = {0: [1, 2, 3], 1: [1, 2, 3]}
shared_items = {k: x[k] for k in x if k in y and x[k] == y[k]}
# shared_items: {1: [1, 2, 3]}
答案 1 :(得分:2)
遗憾的是,它不会在x == y
中有效,因为列表在同一个列表中被认为是不可用的。如何直接比较它们,这应该适用于大多数情况。
<div type="submit" class="btn btn-success pull-right btn-fyi" value="Continuer" />Continuer</div>
答案 2 :(得分:2)
您可以直接将字典与==
进行比较:
In [1]: x = {0:[1,2,3], 1:[1,2,3], 2:[1,2,3]}
In [2]: y = {0:[1,2,3], 1:[1,2,3], 2:[1,2,3]}
In [3]: shared_items = x == y
In [4]: shared_items
Out[4]: True
答案 3 :(得分:0)
您无法制作一组列表。列表是“不可用的”,基本上没有可变对象(more info here)。如果您想做类似的事情,请查看this answer。