思路源於: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]]
。