在列表中旋转值[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我刚刚看了这个例子,谢谢你指出这一点。编辑。