可能性のある複製:
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]
これはどのように行われますか?
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
関数は、入力リストを変更しません。
該当する場合は、collections.deque
をソリューションとして使用できます。
import collections
d = collections.deque([1,2,3,4,5])
d.rotate(3)
print d
>>> deque([3, 4, 5, 1, 2])
おまけとして、組み込みのリストよりも高速になると思います。
次の関数は、リストをl
、x
スペースを右に回転させます。
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)]
>>> 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]