我正在测试基于SVD模型的推荐器。但运行后如下所示收到错误消息:
这是我的测试代码:
import sys
from sys import argv
import csv
import recsys.algorithm
recsys.algorithm.VERBOSE = True
from recsys.algorithm.factorize import SVD
from recsys.datamodel.data import Data
likes = []
with open('/Users/xps13mynotebook/Desktop/w2v/likes.tsv', 'r') as f:
for line in f.readlines():
username,user_likes = line.strip().split('\t')
likes.append((username,user_likes))
data = Data()
VALUE = 1.0
for username in likes:
for user_likes in likes[username]:
data.add_tuple((VALUE, username, user_likes)) # Tuple format is: <value, row, column>
svd = SVD()
svd.set_data(data)
k = 5
svd.compute(k=k, min_values=3, pre_normalize=None, mean_center=False, post_normalize=True)
svd.similar('sheila')
错误:
TypeError Traceback (most recent call last)
<ipython-input-30-913000ff4e0e> in <module>()
10 VALUE = 1.0
11 for username in likes:
---> 12 for user_likes in likes[username]:
13 data.add_tuple((VALUE, username, user_likes)) # Tuple format is: <value, row, column>
14
TypeError: list indices must be integers, not tuple
答案 0 :(得分:0)
TypeError表示当你为元素提供元组时,你不能访问带有列表的元素,它需要一个整数作为列表中的位置。
现在为什么会这样?
likes.append((username,user_likes))
和
for username in likes:
like是存储元组的列表,因此您的用户名就像("mike", 6)
一样。
然后你将它作为元素的位置传递给列表。这就是你收到错误的原因。我不知道你想要你的代码到底做什么,但现在它几乎是无意义的
答案 1 :(得分:0)
当你在元组列表上进行迭代时,每个值都是元组。你的代码表明它是元组的第一个元素(或索引,我不太确定 - 显然它是明显错误的。)
for username in likes:
# username is now tuple from list
for user_likes in likes[username]: # list[tuple_stored_in_list] is invalid and causes TypeError
pass # do something
当迭代元组列表时,使用tuple unpacking
一次实现存储在元组中的两个元素:
for username, user_likes in likes:
data.add_tuple((VALUE, username, user_likes)) # Tuple format is: <value, row, column>