在列表中旋转值[Python]

2024-04-28 11:20:05 发布

您现在位置: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持续将值移动到列表的末尾并用存储在q中的内容替换第0个位置的次数

还有一件事。如果我调用rotate(lst, -3),那么它必须旋转到“左”而不是旋转到“右”。

我对python还不太熟悉,在处理列表的概念上也很难集中精力。谢谢大家的时间和努力。我希望这个问题足够清楚。


Tags: 函数编辑内容列表return情况语句全局
3条回答

这里有一个使用双端队列的解决方案。 根据需要,它就地修改列表,既不使用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

尝试:

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

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

相关问题 更多 >