0x01 常用方法
其实咋说呢,如果使用numpy库的话倒是很简单就可以了,但是啥玩意都不用的话就稍微麻烦一点。
1.基础方法
>>>a=[[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]
>>>print([[row[i] for row in a] for i in range(len(a[0]))])
[[1, 4, 7, 10], [2, 5, 8, 11], [3, 6, 9, 12]]
>>>a=[[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]
>>>print map(list,zip(*a))
[[1, 4, 7, 10], [2, 5, 8, 11], [3, 6, 9, 12]]
参考:http://www.revotu.com/matrix-transpose-in-python.html
2.numpy
>>> a=[[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]
>>> numpy.transpose(a)
array([[ 1, 4, 7, 10],
[ 2, 5, 8, 11],
[ 3, 6, 9, 12]])
参考:https://blog.csdn.net/spcq4/article/details/52769919
0x02 矩阵转置经典题目
题目:
给定一个正整数 n,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
示例:
输入: 3
输出:
[
[ 1, 2, 3 ],
[ 8, 9, 4 ],
[ 7, 6, 5 ]
]
解答
参考的答案里面给出了三种方法,下面来逐一进行分析:
方法一
当 n = 3 时,看一下螺旋矩阵的生成过程:
|| => |9| => |8| |6 7| |4 5| |1 2 3|
|9| => |9 8| => |9 6| => |8 9 4|
|8 7| |7 6 5|
初始矩阵为空,然后每次在顶部添加一行数据,在添加之前对原来的矩阵进行顺时针旋转。
按照这样的思路写的代码如下:
class Solution(object):
def generateMatrix(self, n):
"""
:type n: int
:rtype: List[List[int]]
"""
A, lo = [], n**2+1
while lo > 1:
lo, hi = lo-len(A), lo #每次产生len(A)长度的顶部那行数据
A = [range(lo, hi)] + zip(*A[::-1])
return A
# 这个的作用是对原来的矩阵进行顺时针的旋转
a = zip(*A[::-1])