TypeError: 列表索引必须是整数,而不是列表。如何修复?
这里有一段代码,里面出现了一个类型错误,提示“列表索引必须是整数,而不是列表”,虽然它们其实是整数。我希望你能帮我找出问题所在。我需要从一个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])
错误发生在这里。我不明白如果i
和j
已经是int
,我应该修复什么。
2 个回答
3
for i in lines:
for j in lines:
i
和 j
是在遍历 lines
里的每一行,而不是在遍历行的编号。这意味着 i
和 j
总是代表整行的数字,像是一个列表。
如果你想要遍历行的编号(通常情况下不需要这样做,但在这里可能是个好主意),你可以使用
for i in range(len(lines)):
for j in range(len(lines[i])):
这种设计有点别扭,因为 Python 的设计者希望大家默认是遍历序列里的元素。
另外,注意你的循环尝试在第一行和第一列之前访问 lines
的元素。也许你应该从第二行和第二列开始你的循环。
5
i
和 j
不是索引,它们是来自 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
和/或 j
是 0
时,会指向 T
或 T[i]
的最后一个元素。enumerate()
函数 可以在循环中添加索引。
这假设你已经提前构建了一个嵌套的列表结构在 T
中。