题目地址:https://leetcode.com/problems/transpose-matrix/description/

题目描述

给定一个矩阵 A, 返回 A 的转置矩阵。
矩阵的转置是指将矩阵的主对角线翻转,交换矩阵的行索引与列索引。

示例 1:
输入:[[1,2,3],[4,5,6],[7,8,9]]
输出:[[1,4,7],[2,5,8],[3,6,9]]

示例 2:
输入:[[1,2,3],[4,5,6]]
输出:[[1,4],[2,5],[3,6]]

提示:
1 <= A.length <= 1000
1 <= A[0].length <= 1000

解题思路

对于矩阵$A = \begin{bmatrix}
1 & 2 & 3 \\
4 & 5 & 6 \\
7 & 8 & 9 \\
\end{bmatrix}$,它的转置矩阵是$transA = \begin{bmatrix}
1 & 4 & 7 \\
2 & 5 & 8 \\
3 & 6 & 9 \\
\end{bmatrix}$ 。

转置矩阵transA的行向量就是矩阵A的列向量。并且,转置矩transA的行数等于矩阵A的列数

通过代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution:
def transpose(self, A):
"""
:type A: List[List[int]]
:rtype: List[List[int]]
"""
transA = []
row = len(A[0])
for i in range(row):
# 转置矩transA的行数等于矩阵A的列数
transA.append([])
for i in range(len(A[0])):
for j in range(len(A)):
# 转置矩阵transA的行向量就是矩阵A的列向量
transA[i].append(A[j][i])
return transA

一行代码

刚开始做的时候没有想到使用zip()函数,看到别人用才想到,直接用zip就可以实现了,代码如下:

1
2
3
4
5
6
7
class Solution2:
def transpose2(self, A):
"""
:type A: List[List[int]]
:rtype: List[List[int]]
"""
return list(map(list, zip(*A)))

对这一行代码的过程分析

对于这样的一个矩阵: $transA = \begin{bmatrix}
1 & 4 & 7 \\
2 & 5 & 8 \\
3 & 6 & 9 \\
\end{bmatrix}$ 。 令x = [1,4,7], y = [2,5,8], z = [3,6,9]

使用zip函数如下:

1
2
3
4
5
6
7
x = [1,4,7]
y = [2,5,8]
z = [3,6,9]
xyz = list(map(list, zip(x, y, z)))
print(xyz)
# [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

xyz是题中给的输入矩阵A,那么我们需要对A使用zip(*A)进行一次逆向操作,将其还原成x,y,z,即可完成矩阵转置。

1
2
3
4
5
6
7
8
9
10
11
x = [1,4,7]
y = [2,5,8]
z = [3,6,9]
xyz = list(map(list, zip(x, y, z)))
print(xyz)
# [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
transA = list(map(list, zip(*xyz)))
print(transA)
# [[1, 4, 7], [2, 5, 8], [3, 6, 9]]

关于为什么使用map方法:

zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的对象,举例来说:

1
2
3
4
5
6
7
A=[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
print(list(zip(*A)))
# [(1, 4, 7), (2, 5, 8), (3, 6, 9)]
print(list(map(list, zip(*A))))
# [[1, 4, 7], [2, 5, 8], [3, 6, 9]]

返回的列表中是元组,因此,需要用map方法将每个元组转换为列表。

zip 方法在 Python 2 和 Python 3 中的不同:

在 Python 3.x 中为了减少内存,zip() 返回的是一个对象。如需展示列表,需手动 list() 转换。