我在网上看,似乎无法理解它。我是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'
创建userCompare我做了以下事情:
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表示簇的数量)所以我把它加载到一个dicts列表中。我希望这是有道理的。我开始讨厌python或至少dicts。
答案 0 :(得分:1)
您不能将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
作为关键。
如果你真的需要这样做(例如在Counter
中使用),这里有一个选项:冻结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
来自here。
答案 1 :(得分:1)
您收到该错误是因为您使用“不可用”值(dict
)作为字典键。
例如:
{dic():1}
会给出同样的错误。
字典不能用于密钥,因为它们是可变的。允许可变密钥会对字典造成严重破坏,因为它不知道密钥何时发生了变化,因此查找是不可能的。