python - 如何用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']]
解决方案
您不想直接将其添加到外部列表中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)))
推荐阅读
- reactjs - 在 reactstrap 中将属性设置为变量
- laravel - MethodNotAllowedException 在 Laravel 中向 web.php 发出 Post 请求
- gforth - 如何从解释器内部保存 gforth 图像
- python - 当 Flask 应用程序开始使用 Flask 会话时设置空字典的函数
- html - 似乎无法让表单出现在 div 中?
- node.js - 在 Mongoose 中寻找更新的最佳方法
- javascript - 解析 osascript -l JavaScript 的命令行参数
- java - 控制器类中的按钮事件处理程序不起作用
- java - 在 Spring Boot 中为 JPA 手动插入 ID
- python - 字典值替换