2012-09-28 68 views
0

我有陣列[1,2,1,2,3,4,3,4,1,2]Python的數組操作

欲循環它x次,每次移動陣列的每個元素1的位置向前:

所以下一個循環將是:

2. [2,1,2,3,4,3,4,1,2,1]

3. [1,2,3,4,3,4,1,2,1,2]

等....

我怎樣才能像這樣操作數組?

編輯:

我在想什麼,但也許一些更好的招數:

只要進入陣列上與while循環,並創建了新的週期陣列。

for i in range(11) 
    array[i] = array[i-1] 

等etc..its僞代碼

+0

你試過什麼了嗎? – dm03514

+0

聽起來像HW?你必須嘗試學習! :) –

+0

你試過的任何代碼?? –

回答

4

使用列表數據結構是不是做這個的有效途徑。 A 隊列會更合適。在任何情況下:

使用隊列

正如我建議的,使用隊列(collections.deque):

>>> q = collections.deque([1,2,3,4,5,6,7,8]) 
>>> for _ in xrange(5): 
...  q.rotate(-1) 
... 
>>> q 
deque([6, 7, 8, 1, 2, 3, 4, 5]) 

保持列表

>>> a = [1,2,3,4,5,6,7,8] 
>>> for _ in xrange(5): 
...  a = a[1:] + a[:1] 
... 
>>> a 
[6, 7, 8, 1, 2, 3, 4, 5] 

備選地(更快比前一個):

>>> a = [1,2,3,4,5,6,7,8] 
>>> for _ in xrange(5): 
...  a.append(a.pop(0)) 
... 
>>> a 
[6, 7, 8, 1, 2, 3, 4, 5] 

在這裏你可以改變xrange的任何你想要迭代。

Timeit分析:

彈出追加

>>> timeit.timeit('a.append(a.pop(0))', setup='a = [0,1,2,3,4,5,6,7,8,9]', number=1000000) 
0.24548697471618652 
>>> timeit.timeit('a.append(a.pop(0))', setup='a = [0,1,2,3,4,5,6,7,8,9]', number=100000000) 
23.65538215637207 

切片

>>> timeit.timeit('a=a[1:] + a[:1]', setup='a = [0,1,2,3,4,5,6,7,8,9]', number=1000000) 
0.36037278175354004 
>>> timeit.timeit('a=a[1:] + a[:1]', setup='a = [0,1,2,3,4,5,6,7,8,9]', number=100000000) 
35.06173801422119 

隊列

>>> timeit.timeit('q.rotate(-1)', setup='import collections; q = collections.deque([0,1,2,3,4,5,6,7,8])', number=1000000) 
0.16829514503479004 
>>> timeit.timeit('q.rotate(-1)', setup='import collections; q = collections.deque([0,1,2,3,4,5,6,7,8])', number=100000000) 
16.012277841567993 

隨着一點點的優化,基本上消除了__getattr__呼籲追加,流行和旋轉:

彈出式追加

>>> timeit.timeit('aa(ap(0))', setup='a = [0,1,2,3,4,5,6,7,8,9]; aa=a.append; ap=a.pop', number=1000000) 
0.15255093574523926 
>>> timeit.timeit('aa(ap(0))', setup='a = [0,1,2,3,4,5,6,7,8,9]; aa=a.append; ap=a.pop', number=100000000) 
14.50795292854309 

隊列

>>> timeit.timeit('r(-1)', setup='import collections; q = collections.deque([0,1,2,3,4,5,6,7,8]); r=q.rotate', number=1000000) 
0.13374090194702148 
>>> timeit.timeit('r(-1)', setup='import collections; q = collections.deque([0,1,2,3,4,5,6,7,8]); r=q.rotate', number=100000000) 
11.435136079788208 
1
my_list = [1,2,1,2,3,4,3,4,1,2] 
for i in range(10): 
    my_list.insert(0,my_list.pop()) 
    print my_list 
+0

這是否不會改變它在錯誤的方向? –

0

您的問題找到它在這個問題上的答案(它可以幫助我們改進......) Efficient way to shift a list in python

爲了使短,做一個函數來改變你的陣列:

def shift(l, n): 
    return l[n:] + l[:n] 

然後調用這個函數在一個循環:

myarray=[1,2,3,4,5,6,7] 
for ii in range(10): 
    myarray=shift(myarray, 1) 
    print myarray 
+0

這也相當低效。爲每個班次創建三個新列表! –

+0

當然。但它回答了這個問題(那不是關於優化)。我雖然對初學者有一定的教育價值。 –

4

我會用一個deque因爲它有內置方法旋轉:

import collections 

d = collections.deque([1,2,1,2,3,4,3,4,1,2]) 
for _ in xrange(number_of_shifts): 
    d.rotate(-1) 
    print list(d)