2012-09-28 155 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)