我正在写一个算法,将一个方阵旋转90º,而不使用第二个矩阵。这是可行的,但我有一个小问题困扰着我
因此,基本的工作算法是:
def rotate(matrix):
n = len(matrix)
# reverse rows
matrix.reverse()
# reflect
start = 0
for row in range(n):
for col in range(start, n):
matrix[row][col], matrix[col][row] = matrix[col][row], matrix[row][col]
start = start + 1
其思想是传递一个定义为列表列表的矩阵,如[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
输入/输出示例:
>>> some_matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> rotate(some_matrix)
>>> print(some_matrix)
[[7, 4, 1], [8, 5, 2], [9, 6, 3]]
太好了。所以,我想知道是否可以用一些更直观的东西来代替matrix.reverse()
,比如简单地使用切片索引。所以我写了一个新的rotate
,像这样:
def rotate2(matrix):
n = len(matrix)
# reverse rows
matrix = matrix[::-1]
# reflect
start = 0
for row in range(n):
for col in range(start, n):
matrix[row][col], matrix[col][row] = matrix[col][row], matrix[row][col]
start = start + 1
这会给我同样的结果,基于:
>>> a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> b = a
>>> b = b[::-1]
>>> a.reverse()
>>> print(a)
[[7, 8, 9], [4, 5, 6], [1, 2, 3]]
>>> print(b)
[[7, 8, 9], [4, 5, 6], [1, 2, 3]]
>>> print(a==b)
True
但是,当我在同一输入/输出示例上使用rotate2
时,我得到:
>>> some_matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> rotate2(some_matrix)
>>> print(some_matrix)
[[9, 6, 3], [8, 5, 2], [7, 4, 1]]
那么我在这里错过了什么
matrix = matrix[::-1]
创建一个新列表,并将其分配给本地名称matrix
;它不会就地修改原始列表另一方面,确实修改了原始列表
考虑这些简单函数:相关问题 更多 >
编程相关推荐