为了找到一个数字的旋转我写了一个代码
def rotation(N):
A=[]
for i in range(len(N)):
y=N.pop(0)
N.append(y)
A.append(N)
return A
K=[1,9,7]
r=rotation(K)
print(r)
但它给了我一个输出,如:
A=[[1, 9, 7], [1, 9, 7], [1, 9, 7]]
但应该是
A=[[1,9,7],[9,7,1],[7,1,9]]
我不明白为什么会发生这种情况
谢谢
最佳答案
使用 collections.deque
您应该为此任务使用 collections.deque
并使用专门为此目的设计的就地方法 deque.rotate
。
将 list
用于此任务将需要昂贵的复制操作,而 deque
已针对从队列的开头和结尾快速添加和删除元素进行了优化。有关更多详细信息,请参阅 TimeComplexity。
from collections import deque
A = deque([1, 9, 7])
for i in range(len(A)):
print(A)
A.rotate()
deque([1, 9, 7])
deque([7, 1, 9])
deque([9, 7, 1])
为什么你的代码不起作用
您的代码不起作用的原因是您正在修改同一个对象而不是副本。以下将起作用:
def rotation(N):
A = []
for i in range(len(N)):
N = N[:]
N.append(N.pop(0))
A.append(N)
return A
K = [1,9,7]
r = rotation(K)
print(r)
[[9, 7, 1], [7, 1, 9], [1, 9, 7]]
进一步说明
如果修改同一个对象,
A
将包含 3 个列表,每个列表指向同一个对象,因此将保证相同。请记住,每个列表只是一堆指针。如果每个指针指向一个对象,更改它 3 次意味着最终分配将用于所有子列表。关于python - 数字的轮换-python,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50570334/