1

私は配列を持っています[1,2,1,2,3,4,3,4,1,2]

x回ループしたいのですが、毎回配列をすべての要素1の位置だけ前方に移動します。

したがって、次のループは次のようになります。

2.2。[2,1,2,3,4,3,4,1,2,1]

3.3。 [1,2,3,4,3,4,1,2,1,2]

等....

このように配列を操作するにはどうすればよいですか?

編集:

私が思ったことですが、おそらくいくつかのより良いトリック:

whileループで配列を調べ、forcycleで新しい配列を作成するだけです。

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

などなど。その擬似コード

4

4 に答える 4

5

List データ構造を使用することは、これを行う効率的な方法ではありません。キューの方が適切です。いかなる場合でも:

キューの使用

私が提案したように、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.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
于 2012-09-28T19:05:18.963 に答える
4

dequeメソッドrotateが組み込まれているため、aを使用します。

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)
于 2012-09-28T19:07:55.373 に答える
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
于 2012-09-28T19:02:07.203 に答える
0

あなたの質問は、この質問でその答えを見つけます(答えは改善に役立ちます...) 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
于 2012-09-28T19:06:33.290 に答える