因此,我想将所有元素移到右侧,例如,如果我有一个列表,[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
当我在空闲状态下进入时,我在值[0]的最后一行得到一个错误(在值上突出显示)SyntaxError: invalid syntax
.我不知道为什么会出现这个错误.
此外,我将如何更改我的代码以使其从[5, 4, 3, 2, 1]
后面返回[1, 2, 3, 4, 5]
,即反转过程?
>>> 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
使用deque
模块。
from collections import deque a = deque([1,2,3,4,5]).rotate(1) a = list(a)
这是理想的解决方案,因为它使您可以将列表旋转任意数量的位置。如果要以其他方式旋转它,可以将参数设为rotate
负数。
编辑:
当前接受的答案比这种方法要慢得多。优化了双端队列数据结构,以便在列表的开头和列表的末尾插入,这比接受的答案的线性时间操作快得多。在OP使用代码的上下文中,这可能无关紧要,但是在性能至关重要的任何上下文中,双端队列是必经之路。
我编写了一个小程序,该程序将一个位置的1,000,000个元素的列表旋转1000次。这是结果
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