leetcode 48 [数组] 旋转图像

题目

给定一个 n × n 的二维矩阵表示一个图像。

将图像顺时针旋转 90 度。

说明:

你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。

示例 1:

给定 matrix =
[
[1,2,3],
[4,5,6],
[7,8,9]
],

原地旋转输入矩阵,使其变为:
[
[7,4,1],
[8,5,2],
[9,6,3]
]
示例 2:

给定 matrix =
[
[ 5, 1, 9,11],
[ 2, 4, 8,10],
[13, 3, 6, 7],
[15,14,12,16]
],

原地旋转输入矩阵,使其变为:
[
[15,13, 2, 5],
[14, 3, 4, 1],
[12, 6, 8, 9],
[16, 7,10,11]
]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/rotate-image
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

python解法

class Solution:
    def rotate(self, matrix: List[List[int]]) -> None:
        """
        Do not return anything, modify matrix in-place instead.
        """
        matrix[:] = map(list,zip(*matrix[::-1]))

解释

matrix[:] = map(list,zip(*matrix[::-1]))

整个代码只要一行接下来进行函数讲解

[::-1]

首先是最里层的

matrix[::-1]

假设

In [1]: a=[[1,2,3],[4,5,6],[7,8,9]]

那么

In [2]: a[::-1]
Out[2]: [[7, 8, 9], [4, 5, 6], [1, 2, 3]]

可见a[::-1]为 顺序相反操作(list基础)

zip() 0和 zip(*)

重点强调zip()

Python3 zip() 函数:描述

zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的对象,这样做的好处是节约了不少的内存。

我们可以使用 list() 转换来输出列表。

如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 ***** 号操作符,可以将元组解压为列表。

zip([iterable, ...])
#iterabl -- 一个或多个迭代器;
In [1]: a = [1,2,3]

In [2]: b=[4,5,6]

In [3]: zipped = zip(a,b)

In [4]: zipped
Out[4]: <zip at 0x1c7d8e65b88> #zip 返回的是 对象

In [5]: list(zipped)
Out[5]: [(1, 4), (2, 5), (3, 6)]

In [6]: c = [4,5,6,7,8] # 注意 c 长于 a

In [7]:  list(zip(a,c))
Out[7]: [(1, 4), (2, 5), (3, 6)] # 注意 zip(a,c) 元素个数与最短的列表一致

In [8]: a1, a2 = zip(*zip(a,b))# 与 zip 相反,zip(*) 可理解为解压

In [9]: a1
Out[9]: (1, 2, 3)

In [10]: a2
Out[10]: (4, 5, 6)

那么我们查看 zip(*matrix[::-1])的详细情况:

In [1]: a=[[1,2,3],[4,5,6],[7,8,9]]

In [2]: b=list(zip(*a[::-1]))

In [3]: b
Out[4]: [(7, 4, 1), (8, 5, 2), (9, 6, 3)]

这样不难得出为什么要进行下一步

map()

map()接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的迭代器并返回。

map(function, iterable, )

返回一个将 function 应用于 iterable 中每一项并输出其结果的迭代器。 如果传入了额外的 iterable 参数,function 必须接受相同个数的实参并被应用于从所有可迭代对象中并行获取的项。 当有多个可迭代对象时,最短的可迭代对象耗尽则整个迭代就将结束。 对于函数的输入已经是参数元组的情况,请参阅 itertools.starmap()

map(function, iterable, …)
#参数function传的是一个函数名,可以是python内置的,也可以是自定义的。
#参数iterable传的是一个迭代器(一个或者多个)

map(list,zip(*matrix[::-1]))就非常容易理解了

组合起来便是matrix[:] = map(list,zip(*matrix[::-1]))

PS:我认为[:]就不用我说明什么了

发表评论