为了找到一个数字的旋转我写了一个代码

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/

10-12 22:12