我知道之前已经问过这个问题,但是我没有看到任何以不拆分列表的方式回答它。
说我有一个清单:
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的新手,并且无法绕过这个操作列表的概念。谢谢大家的时间和精力。我希望这个问题足够清楚。
答案 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
答案 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