Python Array Rotation Python Array Rotation arrays arrays

Python Array Rotation


You can rotate a list in place in Python by using a deque:

>>> from collections import deque>>> d=deque([1,2,3,4,5])>>> ddeque([1, 2, 3, 4, 5])>>> d.rotate(2)>>> ddeque([4, 5, 1, 2, 3])>>> d.rotate(-2)>>> ddeque([1, 2, 3, 4, 5])

Or with list slices:

>>> li=[1,2,3,4,5]>>> li[2:]+li[:2][3, 4, 5, 1, 2]>>> li[-2:]+li[:-2][4, 5, 1, 2, 3]

Note that the sign convention is opposite with deque.rotate vs slices.

If you want a function that has the same sign convention:

def rotate(l, y=1):   if len(l) == 0:      return l   y = -y % len(l)     # flip rotation direction   return l[y:] + l[:y]>>> rotate([1,2,3,4,5],2)[4, 5, 1, 2, 3]>>> rotate([1,2,3,4,5],-22)[3, 4, 5, 1, 2]>>> rotate('abcdefg',3)'efgabcd'

For numpy, just use np.roll

>>> aarray([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])>>> np.roll(a, 1)array([9, 0, 1, 2, 3, 4, 5, 6, 7, 8])>>> np.roll(a, -1)array([1, 2, 3, 4, 5, 6, 7, 8, 9, 0])

Or you can use a numpy version of the same rotate above (again noting the difference in sign vs np.roll):

def rotate(a,n=1):    if len(a) == 0:        return a    n = -n % len(a)     # flip rotation direction    return np.concatenate((a[n:],a[:n]))  


A simple and shorthand syntax for array rotation in Python is

arr = arr[numOfRotations:]+arr[:numOfRotations]

Example:

arr = [1,2,3,4,5]rotations = 4then arr = arr[4:]+arr[:4]

gives us

[5,1,2,3,4]


I found a problem that I needed Right and Left rotations for big values of k (where k is number of rotations), so, I implemented the following functions for any size of k.

Right Circular Rotation (left to the right: 1234 -> 4123):

def right_rotation(a, k):   # if the size of k > len(a), rotate only necessary with   # module of the division   rotations = k % len(a)   return a[-rotations:] + a[:-rotations]

Left Circular Rotation (right to the left: 1234 -> 2341):

def left_rotation(a, k):   # if the size of k > len(a), rotate only necessary with   # module of the division   rotations = k % len(a)   return a[rotations:] + a[:rotations]

Sources: