旋转列表中的值 [Python]
Rotating values in a list [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
次,继续将值移向列表的末尾并将第 0 个位置替换为 q 中存储的任何内容。
还有一件事。如果我调用 rotate(lst, -3)
,则不是旋转到 "right",而是必须旋转到 "left"。
我是 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)
生产
[4, 5, 6, 1, 2, 3]
[1, 2, 3, 4, 5, 6]
请查看 PMOTW 在 deque
上的 tutorial
您可以使用切片分配来修改您当前的策略以执行您想要的操作。您已经正确生成了旋转列表,只需使用 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。
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 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
我相信这可以满足所有要求。这个想法来自 Programming Pearls 一书 (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
def rotate(lst, num):
copy = list(lst)
for (i, val) in enumerate(lst):
lst[i] = copy[i - num]
我知道之前有人问过这个问题,但我还没有看到有人在不拆分列表的情况下以某种方式回答它。
假设我有一个列表:
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
次,继续将值移向列表的末尾并将第 0 个位置替换为 q 中存储的任何内容。
还有一件事。如果我调用 rotate(lst, -3)
,则不是旋转到 "right",而是必须旋转到 "left"。
我是 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)
生产
[4, 5, 6, 1, 2, 3]
[1, 2, 3, 4, 5, 6]
请查看 PMOTW 在 deque
您可以使用切片分配来修改您当前的策略以执行您想要的操作。您已经正确生成了旋转列表,只需使用 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。
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 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
我相信这可以满足所有要求。这个想法来自 Programming Pearls 一书 (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
def rotate(lst, num):
copy = list(lst)
for (i, val) in enumerate(lst):
lst[i] = copy[i - num]