TypeError:列表索引必须是整数,而不是Python SVD模型中的元组

时间:2016-09-07 15:10:43

标签: python tuples svd

我正在测试基于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 

2 个答案:

答案 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>