2009-07-31 39 views
8

我有一個列表移動值,但在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 

回答

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將繼續指向原始,未旋轉的名單,並與我的方法,這將涉及更新,旋轉單/雙端隊列。