所以我想将所有元素移到右边,例如,如果我有一个[1, 2, 3, 4, 5]
列表,它将变为[5, 1, 2, 3, 4]
。所以基本上最右边的元素包裹到最左边的元素,其他元素基本上向右移动。
这是我的代码:
length = len(values)
old_right = values[length - 1]
for j in range(length - 1, 0, -1):
values[j] = values[j - 1]
values[0] = old_right
当我在空闲状态下输入时,我在{[1}}的值[0](在值上突出显示)的最后一行得到错误。我不知道为什么会出现这个错误。
此外,我如何更改代码以使其从SyntaxError: invalid syntax
返回[5, 4, 3, 2, 1]
,即撤消流程?
答案 0 :(得分:7)
>>> lst = [1, 2, 3, 4, 5]
>>> [lst[-1]] + lst[:-1]
[5, 1, 2, 3, 4]
反向:
>>> lst = [5, 1, 2, 3, 4]
>>> lst[1:] + [lst[0]]
[1, 2, 3, 4, 5]
修改强>:
我使用[1,2,3,4,5]作为一个例子,但是我编写了代码,可以在任何列表上工作,无论它是什么,它都会将列表的最右边的值放在左边。在您的情况下,这确实有效,但仅在您指定特定列表时才有效。我想知道你会怎么做,所以它适用于任何一般情况。
然后写一个函数。
def shift_right(lst):
try:
return [lst[-1]] + lst[:-1]
except IndexError:
return lst
答案 1 :(得分:4)
使用deque
模块。
from collections import deque
a = deque([1,2,3,4,5]).rotate(1)
a = list(a)
这是理想的解决方案,因为它允许您将列表旋转任意数量的位置。如果您想以另一种方式旋转它,可以使rotate
的参数为负。
编辑:
目前接受的答案比这种方法慢得多。 deque数据结构被优化用于在列表的开头和列表的末尾插入,这比接受的答案的线性时间操作快得多。在OP使用代码的上下文中这可能无关紧要,但在性能重要的任何环境中,deque都是可行的方法。
我写了一个小程序,将1,000,000个元素的列表旋转一个位置1,000次。结果如下
List Slicing: 0:00:12.043186
Deque: 0:00:00.028064
代码就在这里。
import datetime
from collections import deque
start = datetime.datetime.now()
lst = [1]* 1000000
#first approach
for x in range(1000):
lst = [lst[-1]] + lst[:-1]
end = datetime.datetime.now()
print end - start
lst = deque(lst)
#second approach
for y in range(1000):
lst.rotate(1)
lst = list(lst)
start = datetime.datetime.now()
print start - end
答案 2 :(得分:2)
a = [1,2,3,4,5]
x = a.pop()
a.insert(0, x)