Python3实现顺时针旋转矩阵图像的两种算法
本文介绍如何使用Python3将n×n二维矩阵顺时针旋转90度。通过两种方案实现:利用zip()解压与切片反转的简洁写法,以及基于索引规律的原地赋值方法。文章包含完整的代码示例与运行结果,帮助开发者理解矩阵变换的逻辑与实现细节。
问题描述
给定一个 n × n 的二维矩阵表示一个图像,目标是将该图像顺时针旋转 90 度。这是一个常见的算法问题,通常要求在不使用额外空间(原地修改)或空间复杂度较低的情况下完成。
方案一:利用 zip 与切片反转
这种方法利用了 Python 内置函数的特性,代码非常简洁。核心思路是先对矩阵进行上下翻转(按 X 轴对称),然后再进行转置操作。
- 上下翻转:使用切片
matrix[::-1]将矩阵的行顺序颠倒。 - 转置:使用
zip(*...)将翻转后的矩阵进行解压并转置。 - 重组:使用
list()将 zip 对象转换回列表形式。
具体实现如下:
# -*- coding:utf-8 -*-
#! python3
class Solution:
def rotate(self, matrix):
"""
:type matrix: List[List[int]]
:rtype: void Do not return anything, modify matrix in-place instead.
"""
matrix[:] = map(list, zip(*matrix[: : -1]))
return matrix
if __name__ == '__main__':
# 测试代码
matrix = [
[1,2,3,4],
[5,6,7,8],
[9,10,11,12],
[13,14,15,16]
]
solution = Solution()
result = solution.rotate(matrix)
print(result)运行上述代码,对于输入的 4×4 矩阵,输出结果为:
[[13, 9, 5, 1], [14, 10, 6, 2], [15, 11, 7, 3], [16, 12, 8, 4]]方案二:基于索引规律的原地赋值
如果不使用内置函数,可以通过观察旋转前后元素下标的变化规律来实现。顺时针旋转 90 度后,原矩阵中位置 (i, j) 的元素会移动到新矩阵的 (j, n-1-i) 位置。反之,新矩阵中 (i, j) 的元素来源于原矩阵的 (n-1-j, i)。
为了避免在遍历过程中覆盖尚未处理的元素,可以先创建一个副本 m = matrix.copy(),然后遍历原矩阵的每个位置,从副本中读取对应的值进行赋值。
# -*- coding:utf-8 -*-
#! python3
class Solution:
def rotate(self, matrix):
"""
:type matrix: List[List[int]]
:rtype: void Do not return anything, modify matrix in-place instead.
"""
m = matrix.copy()
n = len(matrix)
for i in range(n):
matrix[i] = [m[j][i] for j in range(n - 1, -1, -1)]
return
if __name__ == '__main__':
# 测试代码
matrix = [
[1,2,3,4],
[5,6,7,8],
[9,10,11,12],
[13,14,15,16]
]
solution = Solution()
result = solution.rotate(matrix)
print(result)该方案的运行结果与方案一完全相同,验证了算法的正确性。这种方法虽然使用了额外的空间来存储副本,但逻辑直观,易于理解矩阵旋转的数学本质。
总结
本文展示了两种在 Python3 中实现矩阵顺时针旋转 90 度的方法。方案一利用 zip 和切片,代码简洁高效;方案二通过索引映射,逻辑清晰。开发者可根据具体场景(如是否允许额外空间、代码可读性要求等)选择合适的实现方式。以上就是Python3实现的旋转矩阵图像算法示例的详细内容,更多关于Python算法的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









