Dict不可散列python
我在网上看了看,似乎不太懂。我是python新手,想知道如何解决这个问题 运行时:Dict不可散列python,python,dictionary,hash,numpy,Python,Dictionary,Hash,Numpy,我在网上看了看,似乎不太懂。我是python新手,想知道如何解决这个问题 运行时: results = getRecommendations(userCompare[0], userCompare[0]['1'], sim_distance) 我得到一个错误: TypeError Traceback (most recent call last) <ipython-input-147-4d74cac55074>
results = getRecommendations(userCompare[0], userCompare[0]['1'], sim_distance)
我得到一个错误:
TypeError Traceback (most recent call last)
<ipython-input-147-4d74cac55074> in <module>()
----> 1 results = getRecommendations(userCompare[0], userCompare[0]['1'], sim_distance)
<ipython-input-54-5f2d7e0dd3ba> in getRecommendations(data, person, similarity)
5 for other in data:
6 if other==person: continue #dont compare self
----> 7 sim=similarity(data, person, other)
8 if sim<=0: continue #ignore scores of 0 or lower
9 for item in data[other]:
<ipython-input-146-b30288308fee> in sim_distance(data, c1, c2)
2 def sim_distance(data, c1, c2):
3 si = {} #get the list of shared items
----> 4 for item in data[c1]:
5 if item in data[c2]:
6 si[item] = 1
TypeError: unhashable type: 'dict'
我基本上有一个具有不同K值的质心数组,每个K值都有一个kx1682矩阵(K表示簇的数量),所以我将其加载到dict列表中。我希望这是有道理的。我开始讨厌python或至少是dict了。你不能用
dict
作为字典键。如果我这样做会发生什么:
d = {}
k1 = {1: 2}
k2 = {2: 1}
d[k1] = "a"
d[k2] = "b"
k1[2] = 1
k2[1] = 2
我现在有了k2==k1
,那么d[{1:2,2:1}]
做什么呢?嗯,这就是为什么你不能用一个dict
作为键的原因
如果您真的需要这样做(例如在计数器中使用),这里有一个选项:冻结指令
:
#coding:utf-8
FROZEN_TAG = "__frozen__"
def freeze_dict(obj):
if isinstance(obj, dict):
dict_items = list(obj.items())
dict_items.append((FROZEN_TAG, True))
return tuple([(k, freeze_dict(v)) for k, v in dict_items])
return obj
def unfreeze_dict(obj):
if isinstance(obj, tuple):
if (FROZEN_TAG, True) in obj:
out = dict((k, unfreeze_dict(v)) for k, v in obj)
del out[FROZEN_TAG]
return out
return obj
它来自。您得到该错误是因为您使用了一个“不可损坏”的值(dict
)作为字典键
例如:
{dic():1}
将给出相同的错误
字典不能用于键,因为它们是可变的。允许可变键将对字典造成严重破坏,因为它不知道键何时更改,因此无法进行查找。谢谢!事实上我解决了我的问题。。。调用函数时,我想在第二个参数中加入“1”或任何变量。。节省了我很多时间和挫折这是个不错的选择。制作“hashable dict”的一种现成方法是在将其用作键之前,只使用json.dump()
您的dict
。通常,可变性!=散列性。可以使用可变对象作为键,只要它提供一致的哈希函数。
{dic():1}