Python矩阵转置方法(二维列表行列互换)

有列表如下:

1
matrix = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]

转置(行列互换)后的结果如下:

1
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

方法一:嵌套的列表推导式

1
2
3
4
>>> matrix = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
>>> [[row[col] for row in matrix] for col in range(len(matrix[0]))]
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
>>>

原理很简单:先循环列,在固定列上循环每一行。

方法二:zip迭代 + map映射

在Python2中:

1
2
3
4
>>> matrix = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
>>> map(list, zip(*matrix))
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
>>>

如在Python3下,map函数返回的是迭代器不是列表,将结果用list函数构造成列表:

1
2
3
4
>>> matrix = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
>>> list(map(list, zip(*matrix)))
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
>>>

原理也很清晰:先用zip并行迭代每一个列表元素,然后再用map将结果中的元组转成列表。

大师兄 wechat
欢迎关注我的微信公众号:Python大师兄