首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Dict not hashable python

Dict not hashable python
EN

Stack Overflow用户
提问于 2013-11-21 16:19:17
回答 2查看 4.8K关注 0票数 1

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

运行时:

代码语言:javascript
复制
results = getRecommendations(userCompare[0], userCompare[0]['1'], sim_distance)

我得到了错误:

代码语言:javascript
复制
    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'

为了创建userCompare,我执行了以下操作:

代码语言:javascript
复制
 movies = {}
    prefsList = []
    def loadMovieLens(path = directory):
        # Get movie titles
        for line in open(path + 'u.item'):
            (id, title) = line.split('|')[0:2]
            movies[id] = title 
        # Load data
        for k in range(len(centroidsM)):
            prefs ={}
            for rows in range(len(centroidsM[k])):
                for columns in range(len(centroidsM[k][0,:])):
                    user = str(rows+1)
                    movieid =str(columns+1)
                    prefs.setdefault(user,{})
                    prefs[user][movies[movieid]] = float(centroidsM[k][rows,columns])
            prefsList.append(prefs)
        return prefsList

我基本上有一个具有不同K值的质心数组,每个K值都是一个kx1682矩阵(k表示聚类的数量),所以我将其加载到一个字典列表中。我希望这是有意义的。我开始讨厌python了,至少是dicts。

EN

回答 2

Stack Overflow用户

发布于 2013-11-21 16:24:33

您不能将dict用作字典键。如果我这样做了,会发生什么:

代码语言:javascript
复制
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作为密钥的原因。

如果您确实需要这样做(例如,在Counter中使用),这里有一个选项:冻结dict

代码语言:javascript
复制
#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

here寄来的。

票数 1
EN

Stack Overflow用户

发布于 2013-11-21 16:24:41

之所以会出现这个错误,是因为您使用了一个“不可散列的”值(dict)作为字典键。

例如:

代码语言:javascript
复制
{dic():1}

也会给出同样的错误。

字典不能用于键,因为它们是可变的。允许可变的键将对字典造成严重破坏,因为它不知道键何时更改,因此查找将是不可能的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20115680

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档