TypeError: list indices must be integers, not tuple in Python SVD model

TypeError: list indices must be integers, not tuple in Python SVD model

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

TypeError 是说当您为它提供元组时,您无法访问带有列表的元素,它需要一个整数,它是列表中的位置。

现在为什么会这样?

likes.append((username,user_likes))

for username in likes:

likes 是一个存储元组的列表,因此您在 like 中的用户名类似于 ("mike", 6).

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

当您遍历元组列表时,每个值都是元组本身。您的代码表明它是元组的第一个元素(或索引,我不太确定 - 很明显它是明显错误的)。

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>