旋转列表中的值 [Python]

Rotating values in a list [Python]

我知道之前有人问过这个问题,但我还没有看到有人在不拆分列表的情况下以某种方式回答它。

假设我有一个列表:

num = [1,2,3,4,5,6]

我想创建一个函数:

rotate(lst, x):

因此,如果我调用 rotate(num, 3),它将全局编辑列表 num。这样当我稍后调用 print(num) 时,它将导致 [4,5,6,1,2,3].

我知道我可以这样写函数:

rotate(lst, x):
    return [lst[-x:] + lst[:-x]

但我需要在不使用 return 语句且不拆分列表的情况下执行此功能。我的想法是将列表的最后一个值放入一个变量中:q = lst[-1] 然后从那里创建一个循环,该循环运行 x 次,继续将值移向列表的末尾并将第 0 个位置替换为 q 中存储的任何内容。

还有一件事。如果我调用 rotate(lst, -3),则不是旋转到 "right",而是必须旋转到 "left"。

我是 python 的新手,无法完全理解这个操作列表的概念。谢谢大家的时间和精力。我希望这个问题足够清楚。

这是一个使用双端队列的解决方案。 根据需要,它就地修改列表,既不使用 return 也不使用列表的块。

from collections import deque

def rotate(lst, x):
    d = deque(lst)
    d.rotate(x)
    lst[:] = d

num = [1,2,3,4,5,6]
rotate(num,3)
print(num)
rotate(num,-3)
print(num)

生产

[4, 5, 6, 1, 2, 3]
[1, 2, 3, 4, 5, 6]

请查看 PMOTW 在 deque

上的 tutorial

您可以使用切片分配来修改您当前的策略以执行您想要的操作。您已经正确生成了旋转列表,只需使用 lst[:] = ...

修改列表
def rotate(lst, x):
    lst[:] =  lst[-x:] + lst[:-x]

交互式解释器中的示例:

>>> l = [1, 2, 3, 4, 5, 6]
>>> def rotate(lst, x):
...     lst[:] =  lst[-x:] + lst[:-x]
...
>>> rotate(l, 2)
>>> l
[5, 6, 1, 2, 3, 4]

现在向后旋转:

>>> rotate(l, -2)
>>> l
[1, 2, 3, 4, 5, 6]
>>> rotate(l, -2)
>>> l
[3, 4, 5, 6, 1, 2]

查看另一个问题的答案:

这里是一个简单的方法,在列表中使用 pop 和 insert。

num = [1,2,3,4,5,6]

def rotate(lst, x):
    if x >= 0:
        for i in range(x):
            lastNum = lst.pop(-1)
            lst.insert(0, lastNum)

    else:
        for i in range(abs(x)):
            firstNum = lst.pop(0)
            lst.append(firstNum)

    return

print num #[1, 2, 3, 4, 5, 6]
rotate(num, 2)
print num #[5, 6, 1, 2, 3, 4]
rotate(num, -2)
print num #[1, 2, 3, 4, 5, 6]

尝试:

num = [1,2,3,4,5,6]

def rotate(lst,x):
    copy = list(lst)
    for i in range(len(lst)):
        if x<0:
            lst[i+x] = copy[i]
        else:
            lst[i] = copy[i-x]

rotate(num, 2)

print num

我相信这可以满足所有要求。这个想法来自 Programming Pearls 一书 (http://goo.gl/48yJPw)。要旋转列表,我们可以将其反转,然后以旋转索引为基准反转子列表。

def rotate(num, rot):
    if rot < 0:
        rot = len(num) + rot
    rot = rot - 1
    num.reverse()
    for i in range(rot/2 + 1):
        num[i], num[rot-i] = num[rot-i], num[i]
    for i in range(1, (len(num) - rot)/2):
        num[rot+ i], num[len(num) - i] = num[len(num) - i], num[rot+ i]

#Testing...
num = range(1, 10)
rot = -1
print num
rotate(num, rot)
print num
def rotate(lst, num):
    copy = list(lst)
    for (i, val) in enumerate(lst):
      lst[i] = copy[i - num]