Python Array Rotation

前端 未结 7 1316
夕颜
夕颜 2020-12-03 08:24

So I am implementing a block swap algorithm in python.

The algorithm I am following is this:

Initialize A = arr[0..d-1] and B = arr[d..n-1] 1) Do following u

7条回答
  •  情书的邮戳
    2020-12-03 08:37

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

    >>> from collections import deque
    >>> d=deque([1,2,3,4,5])
    >>> d
    deque([1, 2, 3, 4, 5])
    >>> d.rotate(2)
    >>> d
    deque([4, 5, 1, 2, 3])
    >>> d.rotate(-2)
    >>> d
    deque([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

    >>> a
    array([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]))  
    

提交回复
热议问题