移动值但保留Python列表中的顺序

slo*_*oth 8 python list

我有一份清单

a=[1,2,3,4,5]
Run Code Online (Sandbox Code Playgroud)

并希望"移动"它的值,以便它变成

a=[2,3,4,5,1]
Run Code Online (Sandbox Code Playgroud)

和下一步

a=[3,4,5,1,2]
Run Code Online (Sandbox Code Playgroud)

Python中是否有内置函数来做到这一点?

或者有更短或更好的方式

b=[a[-1]]; b.extend(a[:-1]); a=b
Run Code Online (Sandbox Code Playgroud)

Mil*_*les 25

>>> a = [1,2,3,4,5]
>>> a.append(a.pop(0))
>>> a
[2, 3, 4, 5, 1]
Run Code Online (Sandbox Code Playgroud)

但这很昂贵,因为它必须移动整个列表的内容,即O(n).collections.deque如果在您的Python版本中可用,则可以使用更好的选择,允许在大约O(1)时间内从任一端插入和删除对象:

>>> a = collections.deque([1,2,3,4,5])
>>> a
deque([1, 2, 3, 4, 5])
>>> a.rotate(-1)
>>> a
deque([2, 3, 4, 5, 1])
Run Code Online (Sandbox Code Playgroud)

另请注意,这两个解决方案都涉及更改原始序列对象,而您的创建新列表并将其分配给a.所以如果我们这样做:

>>> c = a
>>> # rotate a
Run Code Online (Sandbox Code Playgroud)

使用您的方法,c将继续引用原始的,未旋转的列表,并且使用我的方法,它将引用更新的,旋转的列表/双端队列.