我试图像这样对2D矩阵进行90度的顺时针旋转:
Goal: Rotate CW
[1,2,3]
[4,5,6]
[7,8,9]
----Reverse order of rows in matrix.
[7,8,9]
[4,5,6]
[1,2,3]
----Zip together first elements in each row.
[7,4,1]
[8,5,2]
[9,6,3]
我编写了以下函数来执行此操作,当我在自己的测试数据上运行该函数时,该函数运行良好:
# Works on my own test cases
def rotate_matrix(square_matrix):
square_matrix = zip(*square_matrix[::-1])
square_matrix = list(map(list, square_matrix))
return square_matrix
例如:
m1 = [[1, 2],
[3, 4]]
r1 = rotate_matrix(m1)
# r1:
# [[3, 1]
# [4, 2]]
m2 = [[1,2,3,4],
[5,6,7,8],
[9,10,11,12],
[13,14,15,16]]
r2 = rotate_matrix(m2)
# r2:
# [[13, 9, 5, 1]
# [14, 10, 6, 2]
# [15, 11, 7, 3]
# [16, 12, 8, 4]]
现在,我正在阅读《 Python中的编程面试要素》一书,该书具有针对这些问题的测试框架(位于https://github.com/adnanaziz/EPIJudge),除非将代码修改为以下内容,否则我将无法通过任何测试用例。以下:
# Works on EPI test cases
def rotate_matrix(square_matrix):
square_matrix[:] = zip(*square_matrix[::-1])
square_matrix[:] = map(list, square_matrix)
return square_matrix
我以为我了解python列表的特质,但在这里我很茫然。我正在尝试修改列表,为什么要在赋值语句中使用square_matrix[:]
而不是square_matrix
?
仅当我在EPI测试框架中运行它时才再次遇到问题。实际上,一旦删除[:]
PyCharm就会告诉我“未使用局部变量'square_matrix'值”。