旋转数字 -python

Rotation of the numbers-python

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

1
2
3
4
5
6
7
8
9
10
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)

但它给了我一个输出,比如:

1
A=[[1, 9, 7], [1, 9, 7], [1, 9, 7]]

但应该是

1
A=[[1,9,7],[9,7,1],[7,1,9]]

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


使用一个简单的列表切片:

1
2
3
4
5
6
7
8
9
10
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
2
3
4
def rotation(N):
    return [N[i:] + N[:i] for i in range(len(N))]
K = [1, 9, 7]
print(rotation(K))


使用collections.deque

你应该使用这个collections.deque任务和使用灌注法在设计这deque.rotate特别用途。

这是使用一list任务需要昂贵的复制操作,而deque几乎是除了添加和移除元素的开始和结束(一A队列。湖时间的更多细节。

1
2
3
4
5
6
7
8
9
10
11
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])

为什么你的代码不工作

你的代码不工作的原因是因为你是相同的对象,而不是修改的一个副本。做下面的工作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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]]

进一步的解释

如果你想修改相同的对象,A3与每个列表列表包含指向同一个对象,因此必须保证将是相同的。记住你只是一堆指针列表。如果每一个变化点的对象的指针,它的最终赋值时报均值3将用于所有的子列表。


我看到你想要做的。所有在这里是第一,改进:你可以把这个变量"Y",那么这样的:

1
N.append(N.pop(0))

然后,你必须复制列表:

1
A.append(N[:])

整个代码看起来像这样:

1
2
3
4
5
6
def rotation(N):
A=[]
for i in range(len(N)):
    N.append(N.pop(0))
    A.append(N[:])
return A

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

这样做的工作。这是因为知识manages Python列表。这是希望的。