给定一个矩阵 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]]
Python实现转置:https://www.cnblogs.com/anpengapple/p/5427367.html
其实不动脑筋的话,用个二重循环很容易写出来:
def trans(m):
a = [[] for i in m[0]]
for i in m:
for j in range(len(i)):
a[j].append(i[j])
return a
m = [[1, 2], [3, 4], [5, 6]] # 想象第一个列表是原始的,后面的是往里添加的
print trans(m) # result:[[1, 3, 5], [ 2, 4, 6]]
然后又是一个不小心的发现:
这种转置矩阵的即时感是怎么回事?
没错,这个问题的本质就是求解转置矩阵。于是就简单了,还是用个不动脑筋的办法:
def trans(m):
for i in range(len(m)):
for j in range(i):
m[i][j], m[j][i] = m[j][i], m[i][j]
return m
m = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
print trans(m)
其实还是有点bug的,看起来是好用的,然而这个矩阵要求行列长度相同才行。
最后,群里某大神说:如果只是转置矩阵的话,直接zip就好了。这才想起来zip的本质就是这样的,取出列表中的对应位置的元素,组成新列表,正是这个题目要做的。
所以最终,这个题目(转置矩阵)的python解法就相当奇妙了:
def trans(m):
return zip(*d)
没错,就这么简单。python的魅力。
超强!
class Solution:
def transpose(self, A): # 方法一
A[::] = zip(*A)
return A
def transpose1(self, A): # 方法二
if len(A) == 0: return []
r, c = len(A), len(A[0])
return [[A[i][j] for i in range(r)] for j in range(c)]
if __name__ == '__main__':
solu = Solution()
A = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
print(solu.transpose(A))
x = ['1', '2', '3']
y = ['a', 'b', 'c']
z = list(zip(x, y))
print(z) # [('1', 'a'), ('2', 'b'), ('3', 'c')]
(2)zip(*):相当于解压,简单理解就是,把一个矩阵本来是一行一行的储存的,现在解压成一列一列的储存,相当于矩阵转置。例如:
x = [['1', 'a'], ['2', 'b'], ['3', 'c']]
z = list(zip(*x))
print(z) # [('1', '2', '3'), ('a', 'b', 'c')]
注意:如果要直接输出,zip()内容要经过 list() 之后才能显示出来。