我有两个词典
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]}
Run Code Online (Sandbox Code Playgroud)
我需要检查这两个词典的相似性.我正在使用以下代码
shared_items = set(x.items()) & set(y.items())
Run Code Online (Sandbox Code Playgroud)
但它给了我
TypeError: unhashable type: 'list' 错误.
这个问题的原因是什么以及如何纠正它.
A 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))}
Run Code Online (Sandbox Code Playgroud)
虽然,由于dict允许a 中的值是可变的,因此您可能希望找到另一种数据结构以获得更通用的解决方案.以下将返回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]}
Run Code Online (Sandbox Code Playgroud)
不幸的是,它在 中不起作用Python3x,因为列表被认为是不可散列的。直接比较它们怎么样,这应该适用于大多数情况。
x == y
Run Code Online (Sandbox Code Playgroud)