为了找到数字的旋转,我写了一个像
这样的代码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]]
我不明白为什么会这样 感谢
答案 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管理列表的方式。希望这有帮助。