思路源于:Leetcode的螺旋矩阵题解 - Sui Xin
对于一个矩阵如下。
matrix = [
[1,2,3],
[4,5,6],
[7,8,9]
]
将其逆时针旋转90度为如下形式。
res = [
[3, 6, 9],
[2, 5, 8],
[1, 4, 7]
]
代码仅需一行。
res = list(map(list, zip(*matrix)))[::-1]
解释
zip(*matrix) 解压
>>> zip(*matrix)
# 将得到保存如下数组的 zip 对象
[(1, 4, 7), (2, 5, 8), (3, 6, 9)]
map(list, _) 将 zip 对象转为 list
注意到上述[(1, 4, 7), (2, 5, 8), (3, 6, 9)]
中元素为元组;使用map(list, )
为每个元素套上一个list()
函数。
a = [(1, 4, 7), (2, 5, 8), (3, 6, 9)]
>>> map(list, a)
# 上述效果与下面的操作相同
>>> tmp = []
>>> for aa in a:
>>> tmp.append(list(aa))
即通过map(list, zip(*matrix))
得到:包含[[1, 4, 7], [2, 5, 8], [3, 6, 9]]
的map对象。
list(_)[::-1] 将 map 对象转为 list 并翻转
先将可迭代对象_
包裹成列表,再反转。
插曲:s = 'python'
,则s[::-1]
为nohtyp
,s[::-2]
为nhy
。
因此,我们最后实际上是将[[1, 4, 7], [2, 5, 8], [3, 6, 9]]
翻转,即得到 [[3, 6, 9], [2, 5, 8], [1, 4, 7]]
。