在Python列表中移动值但保持顺序
我有一个列表
a=[1,2,3,4,5]
我想把里面的值“移动”一下,让它变成
a=[2,3,4,5,1]
接下来的步骤是
a=[3,4,5,1,2]
在Python里有没有现成的函数可以做到这一点呢?
或者有没有比
b=[a[-1]]; b.extend(a[:-1]); a=b
更简短或更好用的方法?
1 个回答
25
>>> a = [1,2,3,4,5]
>>> a.append(a.pop(0))
>>> a
[2, 3, 4, 5, 1]
不过,这样做代价很高,因为它需要移动整个列表的内容,这个过程是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])
另外要注意,这两种解决方案都涉及到改变原来的序列对象,而你的方法是创建了一个新的列表并把它赋值给a
。所以如果我们这样做:
>>> c = a
>>> # rotate a
使用你的方法,c
会继续指向原来的、没有旋转的列表,而使用我的方法,它会指向更新后的、旋转过的列表/双端队列。