zip 是这样做的正确方法,如 aga 所示。
但如果您想知道为什么您的原始代码不起作用:
for i in results:
for j in range(numCenturies):
rotated[i][j] = results [j][i]
这里有两个明显的问题,而且可能还有另外两个问题。 (由于您没有向我们展示足够多的代码或数据来确定,我不能保证这两个可能。)
大概results 看起来像这样:
results = [[1, 2, 3], [4, 5, 6]]
当您使用for i in results 时,这意味着i 将是结果中的每个元素——也就是说,它将是[1, 2, 3],然后是[4, 5, 6]。您不能将列表用作列表的索引,因此可以保证为您提供TypeError: list indices must be integers, not list。
要解决此问题,您需要:
for i in range(len(results)):
……或……
for i, row in enumerate(results):
接下来,results[j][i] 肯定会提升IndexError: list index out of range,因为i 是每个行 编号,但您正试图将其用作列数字。如果您要遍历 results 的行和列,您需要这样:
rotated[j][i] = results[i][j]
接下来,除非您用 3 个列表预先填充 rotated,每个列表都预先填充 2 个某种对象,否则您将获得一个 IndexError: list assignment index out of range。
要解决此问题,您需要预先填写 rotated,如下所示:
rotated = [[None for j in range(2)] for i in range(3)]
……或……
rotated = [[None, None], [None, None], [None, None]]
最后,我打赌numCenturies 是3,在这种情况下,一旦j 达到2,你就会得到另一个IndexError: list index out of range。这里最简单的做法是只使用行的长度;这样一来,就不会出现一个错误的错误。
把它们放在一起:
rotated = [[None for j in range(2)] for i in range(3)]
for i, row in enumerate(results):
for j, value in enumerate(row):
rotated[j][i] = value
但总的来说,Python 为您提供了比预先创建数组和遍历索引来填充值更简单的方法。你可以使用append——或者,更好的是,列表理解。或者,更好的是,找到一种更高级别的方式来编写您的使用,例如对zip 的一次调用。