我有这段代码,我试图将p位置按值1和循环顺序移位,例如p[1]=p[0], p[2]=p[1].... till p[4]=p[0]
我应用了以下逻辑,但我得到的只是p [0],任何人都可以提出建议......
p=[1, 1, 0, 0, 0]
def move(p, U):
q=[]
for i in range(len(p)):
print p[i]
m=(U+i)%(len(p))
p[m]=p[i]
q=p
return q
print move(p, 1)
答案 0 :(得分:6)
m=(U+i)%(len(p))
p[m]=p[i]
就在这里,你正在修改你的列表,因为你正在迭代它。这是禁忌。首先尝试制作一个新列表并修改它。
q = [None for _ in range(len(p))] # q has length == len(p), filled with None
for i, value in enumerate(p):
print value
m = (U+i) % len(p)
q[m] = value
我也在这里使用enumerate
,当你需要索引和可迭代的值时,这更加惯用。
请注意,如果您在这里尝试效率而非算法练习,collections.deque
是您的朋友。 deque是一个双端队列,因此它支持从开始和结束的高效弹出和插入。它还有一个rotate
函数,可以完成这个。
from collections import deque
d = deque(p)
# d = deque([1, 1, 0, 0, 0])
d.rotate(-1) # rotate left by an index
# d = deque([1, 0, 0, 0, 1])
d.rotate(1) # rotate right by an index
# d = deque([1, 1, 0, 0, 0])
d.rotate(1) # rotate right by an index
# d = deque([0, 1, 1, 0, 0])
答案 1 :(得分:2)
一种非常简单的方法:
p.insert(0, p.pop())
答案 2 :(得分:1)
您可以通过切片列表来完成此操作。
l = [1,2,3,4,5]
def move(my_list=None, step=None):
return my_list[step:] + my_list[:step]
print move(my_list=l, step=1)
print move(my_list=l, step=2)
print move(my_list=l, step=-1)
输出
[2, 3, 4, 5, 1]
[3, 4, 5, 1, 2]
[5, 1, 2, 3, 4]