思路源于: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]nohtyps[::-2]nhy

因此,我们最后实际上是将[[1, 4, 7], [2, 5, 8], [3, 6, 9]]翻转,即得到 [[3, 6, 9], [2, 5, 8], [1, 4, 7]]