在列表中旋转值[Python]

在列表中旋转值[Python],python,rotation,Python,Rotation,我知道以前有人问过这个问题,但我还没有看到任何人以不拆分列表的方式回答这个问题 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) num = [1,2,3,4,5,6] def rotate(lst,

我知道以前有人问过这个问题,但我还没有看到任何人以不拆分列表的方式回答这个问题

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)
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]
我想创建一个函数:

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新手,在处理列表这一概念上遇到了困难。谢谢大家的时间和努力。我希望这个问题足够清楚

下面是一个使用双端队列的解决方案。 根据需要,它就地修改列表,既不使用
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)
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, 5, 6, 1, 2, 3]
[1, 2, 3, 4, 5, 6]

请查看
deque

上的PMOTW。您可以使用切片分配来修改当前策略,以实现您的目标。您已经正确生成了旋转列表,只需使用
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

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)
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旋转(lst,x):
复制=列表(lst)
对于范围内的i(len(lst)):

如果x我相信这满足所有要求。这个想法来自编程珍珠书()。要旋转一个列表,我们可以反转它,然后以旋转索引为轴心反转子列表

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旋转(num,rot):
如果rot<0:
rot=len(num)+rot
rot=rot-1
倒数
对于范围内的i(rot/2+1):
num[i],num[rot-i]=num[rot-i],num[i]
对于范围(1,(len(num)-rot)/2内的i:
num[rot+i],num[len(num)-i]=num[len(num)-i],num[rot+i]
#测试。。。
num=范围(1,10)
rot=-1
打印数
旋转(数值,旋转)
打印数

人们通常会说“就地编辑列表”,而不是“全局编辑列表”。你可能会发现这很有趣:哦,谢谢!更新行话总是有帮助的。:)好的,但不是
没有返回语句,也没有拆分列表。
要求?人力资源管理。。。我可以看出
不拆分列表
可能意味着
不允许使用切片操作符
,但这不是我第一次读到它的方式。是的,这个解决方案在没有return语句的情况下运行良好,但它拆分了列表。有没有办法做到这一点而不分裂?抱歉,分割,切片。。。我是新来的:/是的,我可能会遵从其他突然出现的答案之一。@rofls我刚刚看了这个例子,谢谢你指出这一点。编辑。