首页 > 解决方案 > 如何用for循环转置矩阵?

问题描述

试图找出转置列表列表(我相信这是一个不确定的矩阵。)我知道可能有更高级和更简洁的方法来做到这一点,但试图限制自己使用我的课程到目前为止所涵盖的内容。

grid = [['apples', 'oranges', 'cherries', 'banana'],
        ['Alice', 'Bob', 'Carol', 'David'],
        ['dogs', 'cats', 'moose', 'goose']]

我知道如何通过打印来做到这一点。我会这样做。

for j in range(len(grid[0])):
    for i in range(len(grid)):
        print(grid[i][j],end=' ')
    print('')

但我正在努力通过实际将其保存到变量来弄清楚如何做到这一点。这会以正确的顺序保存它,但我不知道要添加什么以将其分隔到不同的列表中

newgrid = []
for j in range(len(grid[0])):
    for i in range(len(grid)):
        newgrid.append([grid[i][j])
    # list separation here

最终结果应该是

grid = [['apples', 'Alice', 'dog'],
        ['oranges', 'Bob', 'cats'],
        ['cherries', 'Carol', 'moose'],
        ['banana', 'David', 'goose']]

标签: python

解决方案


您不想直接将其添加到外部列表中newgrid。相反,您想将其添加到最新。您可以通过在外部 for 循环的每次迭代中将一个空列表附加到外部列表,然后从内部附加到该列表来实现此目的。这是正确的代码:

newgrid = []
for j in range(len(grid[0])):
    newgrid.append([])                    # <-- add a new row
    for i in range(len(grid)):
        newgrid[-1].append(grid[i][j])    # <-- note the [-1] to add it to the latest row of newgrid

为了完整起见,您可以使用解包轻松完成此操作zip,如下所示:

newgrid = list(zip(*grid))

或者,如果您想要列表列表而不是元组列表:

newgrid = list(map(list, zip(*grid)))

推荐阅读