在列表中旋转值[Python]

时间:2015-11-05 20:56:25

标签: python rotation

我知道之前已经问过这个问题,但是我没有看到任何以不拆分列表的方式回答它。

说我有一个清单:

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次,继续将值移向列表的结尾,用q中存储的内容替换第0个位置。

还有一件事。如果我拨打rotate(lst, -3)然后转而不是“向右”,则必须旋转到“左”。

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

6 个答案:

答案 0 :(得分:5)

您可以使用切片分配来修改您当前的策略以执行您想要的操作。您已经正确生成了旋转列表,只需使用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]

在另一个问题上查看此答案:https://stackoverflow.com/a/10623383/3022310

答案 1 :(得分:1)

这是使用双端队列的解决方案。 根据需要,它会修改列表,既不使用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]

请在deque

上查看PMOTW的tutorial

答案 2 :(得分:1)

def rotate(lst, num):
    copy = list(lst)
    for (i, val) in enumerate(lst):
      lst[i] = copy[i - num]

答案 3 :(得分:0)

这是一个在列表中使用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]

答案 4 :(得分:0)

尝试:

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

答案 5 :(得分:0)

我相信这满足了所有要求。这个想法来自Programming Pearls book(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