旋转数字 - 蟒蛇

时间:2018-05-28 16:24:37

标签: python

为了找到数字的旋转,我写了一个像

这样的代码
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]]

我不明白为什么会这样 感谢

4 个答案:

答案 0 :(得分:2)

使用简单列表切片

def rotation(N):
    output = []
    for i in range(len(N)):
        output.append(N[i:] + N[:i])
    return output

K=[1,9,7]
r=rotation(K)
print(r)
# [[1, 9, 7], [9, 7, 1], [7, 1, 9]]

答案 1 :(得分:1)

使用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次意味着最终分配将用于所有子列表的

答案 2 :(得分:1)

| log()

答案 3 :(得分:-1)

我明白你想做什么。首先,这是一个改进: 你可以省略这个变量“y”,所以像这样:

N.append(N.pop(0))

然后,您必须复制列表:

A.append(N[:])

所以整个代码看起来像:

def rotation(N):
A=[]
for i in range(len(N)):
    N.append(N.pop(0))
    A.append(N[:])
return A

K = [1,9,7] R =旋转(K) 打印(r)的

这确实有效。这是因为Python管理列表的方式。希望这有帮助。