
本文详解如何纯 python 实现任意次数的 90° 顺时针网格旋转,包含正确转置+列逆序的核心逻辑、可复用函数设计、输入输出规范及常见错误修正(如原代码返回 none 的根本原因)。
在不依赖 NumPy 的前提下,对二维列表(网格)进行 90 度顺时针旋转,本质是两个步骤的组合:先按行优先转置(即 grid[j][i]),再将每一行(即原矩阵的列)逆序排列。例如原始 3×3 网格:
4 3 1 6 5 2 9 7 3
一次 90° 顺时针旋转后应为:
9 6 4 7 5 3 3 2 1
但注意:题目示例中给出的目标输出
1 2 3 3 5 7 4 6 9
实际对应的是 逆时针旋转 90°(等价于顺时针旋转 270°),或更准确地说——该输出是原矩阵先转置、再对每行反转的结果(即标准顺时针 90° 旋转的数学定义)。我们以标准定义为准:顺时针 90° = 转置 + 每列(作为新行)从下到上取 → 即新矩阵第 i 行 = 原矩阵第 (n−1−i) 列。
✅ 正确旋转函数实现如下:
def rotate_90_clockwise(grid):
"""对二维列表 grid 执行一次 90 度顺时针旋转,返回新网格"""
if not grid or not grid[0]:
return grid
n = len(grid)
m = len(grid[0])
# 新网格:列变行,且原最后一列变为第一行
return [[grid[n - 1 - j][i] for j in range(n)] for i in range(m)]但更简洁通用(支持非方阵)且符合经典写法的版本是:
def rotate_90_clockwise(grid):
"""标准实现:转置 + 每行反转"""
# 转置:行索引与列索引互换
transposed = [[grid[j][i] for j in range(len(grid))] for i in range(len(grid[0]))]
# 每行反转 → 完成顺时针90°
return [row[::-1] for row in transposed]⚠️ 原问题代码失败的关键原因:
- rotate90() 函数中未 return newList,导致默认返回 None;
- 循环范围错误:range(N-1) 遗漏了最后一行/列(应为 range(N));
- 未处理“N次旋转”——需循环调用或模 4 优化(因旋转 4 次回到原状)。
✅ 完整可运行解决方案(适配题目输入格式):
def rotate_90_clockwise(grid):
if not grid:
return grid
# 转置 + 行反转
return [list(row)[::-1] for row in zip(*grid)]
def main():
# 读取 N(网格边长)
N = int(input().strip())
grid = []
for _ in range(N):
row = list(map(int, input().split()))
grid.append(row)
# 读取旋转次数
rotations = int(input().strip())
# 旋转 0~3 次即可(模4优化)
effective_rot = rotations % 4
for _ in range(effective_rot):
grid = rotate_90_clockwise(grid)
# 输出结果
for row in grid:
print(' '.join(map(str, row)))
if __name__ == "__main__":
main()? 使用说明:
- 输入第一行为 N(如 3);
- 接下来 N 行,每行 N 个空格分隔整数;
- 最后一行输入旋转次数(如 1 表示顺时针90°,3 等价于逆时针90°);
- 输出为旋转后的网格,每行数字空格分隔。
? 提示:若需逆时针90°,可直接调用 rotate_90_clockwise() 三次,或改用 zip(*grid[::-1])(转置 + 行序反转)——但统一用模4+单函数更健壮。
总结:掌握 zip(*grid) 实现转置、配合切片 [::-1] 完成方向调整,即可零依赖实现任意次数的精准旋转;务必检查函数返回值、边界索引和输入解析逻辑,避免 None 或越界错误。










