代码中的逻辑问题

时间:2017-08-17 20:27:02

标签: python python-3.x

我有这段代码,我试图将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)

3 个答案:

答案 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]