Skip to main content
 首页 » 编程设计

Python 数组操作

2025年05月04日12leader

我有数组[1,2,1,2,3,4,3,4,1,2]

我想循环它 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 循环创建新数组。

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

etc.its伪代码

请您参考如下方法:

使用列表数据结构并不是执行此操作的有效方法。 Queue 会更合适。无论如何:

使用队列

正如我所建议的,使用队列 ( 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('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