TypeError: 列表索引必须是整数,而不是列表。如何修复?

6 投票
2 回答
41819 浏览
提问于 2025-04-17 22:30

这里有一段代码,里面出现了一个类型错误,提示“列表索引必须是整数,而不是列表”,虽然它们其实是整数。我希望你能帮我找出问题所在。我需要从一个7x5的源表格中获取一个7x5的矩阵,里面有不同的值。错误发生在最后一行。

lines = []

with open("text.txt") as f:
    for line in f:
        line = [int(x) for x in line if (x != ' ') and (x != '\n')]
        lines.append(line)
    f.close()

我读取文件后得到的是一个包含数字的列表,叫做“lines”。这些都是整数,不是字符串。比如:

>> [[1, 2, 3...], [4, 5, 6...], [7, 8, 9...],[...]]


i = 1
j = 1
T = []
T.append(lines[0][0]) 

我这样做是为了避免在最后一行出现IndexError(列表越界)的错误(像是i-1之类的)。不过,我觉得这并不是很符合Python的写法。我也希望能得到这方面的帮助。

for i in lines:
    for j in lines:
        T[i][j] = lines[i][j] + max(T[i][j-1], T[i-1][j])

错误发生在这里。我不明白如果ij已经是int,我应该修复什么。

2 个回答

3
for i in lines:
    for j in lines:

ij 是在遍历 lines 里的每一行,而不是在遍历行的编号。这意味着 ij 总是代表整行的数字,像是一个列表。

如果你想要遍历行的编号(通常情况下不需要这样做,但在这里可能是个好主意),你可以使用

for i in range(len(lines)):
    for j in range(len(lines[i])):

这种设计有点别扭,因为 Python 的设计者希望大家默认是遍历序列里的元素。

另外,注意你的循环尝试在第一行和第一列之前访问 lines 的元素。也许你应该从第二行和第二列开始你的循环。

5

ij 不是索引,它们是来自 lines 列表的值。Python 的 for 循环是一种“遍历每个元素”的方式。

使用方法:

for i, line in enumerate(lines):
    for j, value in enumerate(line):
        T[i][j] = value + max(T[i][j - 1 % len(T[i])] + T[i - 1 % len(T)][j])

在这里,% len() 的计算会“循环回去”,也就是说当 i 和/或 j0 时,会指向 TT[i] 的最后一个元素。enumerate() 函数 可以在循环中添加索引。

这假设你已经提前构建了一个嵌套的列表结构在 T 中。

撰写回答