Dict不可散列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>

我在网上看了看,似乎不太懂。我是python新手,想知道如何解决这个问题

运行时:

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}