web-dev-qa-db-ja.com

Pythonリストの回転

可能性のある複製:
Pythonでリストをシフトする効率的な方法

Pythonリストを右または左に任意の数の項目で回転させたい(後者は負の引数を使用)。

このようなもの:

>>> l = [1,2,3,4]
>>> l.rotate(0)
[1,2,3,4]
>>> l.rotate(1)
[4,1,2,3]
>>> l.rotate(-1)
[2,3,4,1]
>>> l.rotate(4)
[1,2,3,4]

これはどのように行われますか?

74
Drew Noakes
def rotate(l, n):
    return l[-n:] + l[:-n]

より一般的な方向:

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

例:

example_list = [1, 2, 3, 4, 5]

rotate(example_list, 2)
# [3, 4, 5, 1, 2]

rotateの引数は、リストとシフトを示す整数です。この関数は、 スライス を使用して2つの新しいリストを作成し、これらのリストの連結を返します。 rotate関数は、入力リストを変更しません。

149
YXD

該当する場合は、collections.dequeをソリューションとして使用できます。

import collections

d = collections.deque([1,2,3,4,5])
d.rotate(3)

print d
>>> deque([3, 4, 5, 1, 2])

おまけとして、組み込みのリストよりも高速になると思います。

96
tomasz

次の関数は、リストをlxスペースを右に回転させます。

def rotate(l, x):
  return l[-x:] + l[:-x]

x[-len(l), len(l)]の範囲外の場合にのみ、元のリストが返されることに注意してください。 xのすべての値に対して機能させるには、次を使用します。

def rotate(li, x):
  return li[-x % len(li):] + li[:-x % len(li)]
21
Aaron Dufour
>>> l=[1,2,3,4]
>>> l[1:]+l[:1]
[2, 3, 4, 1]
>>> l=[1,2,3,4]
>>> l[2:]+l[:2]
[3, 4, 1, 2]
>>> l[-1:]+l[:-1]
[4, 1, 2, 3]

一般的にnを左(rotateへの呼び出しで正のy)または右(負のy)に回転すると、次のようになります。

def rotate(l, y=1):
   if len(l) == 0:
      return l
   y = y % len(l)    # Why? this works for negative y

   return l[y:] + l[:y]

回転の方向を例と同じにしたい場合は、rotateでyを無効にします。

def rotate(l, y=1):
   if len(l) == 0:
      return l
   y = -y % len(l)     # flip rotation direction

   return l[y:] + l[:y]
7
the wolf