2016-09-07 27 views
0

我正在测试基于SVD模型的推荐器。TypeError:列表索引必须是整数,而不是Python中的元组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

无法理解你的代码...它不是indented..use likes.username而不是喜欢[usernsame] – SumanKalyan

回答

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> 
0

的类型错误是说,你不能访问元素一个列表,当你提供一个元组时,它需要一个整数,它是列表中的位置。

现在为什么会发生这种情况?

likes.append((username,user_likes)) 

for username in likes: 

喜欢在这里的元组存储的清单,让您在喜欢的用户名是一样的东西("mike", 6)

然后你将它作为元素的位置传递给列表。这就是为什么你得到一个错误。我不确切知道你想要你的代码做什么,但现在它几乎是无稽之谈

相关问题