比较两个词典时键入错误

时间:2018-06-14 12:48:14

标签: python

我有两个词典

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'错误。

此问题的原因是什么以及如何纠正。

4 个答案:

答案 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