Home > OS >  How can I rotate a list right and left?
How can I rotate a list right and left?

Time:12-03

I have been trying to rotate a list left and right in python

def rotate(l, r):
    return l[r:]   l[:r]

l = eval(input())
r = int(input())

print(rotate(l, r))

but if i give input list as ['A','B','C','D',1,2,3,4,5] and r = -34 I'm getting output as

['A', 'B', 'C', 'D', 1, 2, 3, 4, 5] 

but actual output is this :

['C', 'D', 1, 2, 3, 4, 5, 'A', 'B']

Can anyone tell how can I do it?

CodePudding user response:

First you could use print() and test it for different values

def rotate(l, r):
    return l[r:]   l[:r]

l = ['A','B','C','D',1,2,3,4,5]

print('len(l):', len(l))

for r in range(0, -34, -1):
    print(f"{r:3}", rotate(l, r))

And you see

len(l): 9
  0 ['A', 'B', 'C', 'D', 1, 2, 3, 4, 5]
 -1 [5, 'A', 'B', 'C', 'D', 1, 2, 3, 4]
 -2 [4, 5, 'A', 'B', 'C', 'D', 1, 2, 3]
 -3 [3, 4, 5, 'A', 'B', 'C', 'D', 1, 2]
 -4 [2, 3, 4, 5, 'A', 'B', 'C', 'D', 1]
 -5 [1, 2, 3, 4, 5, 'A', 'B', 'C', 'D']
 -6 ['D', 1, 2, 3, 4, 5, 'A', 'B', 'C']
 -7 ['C', 'D', 1, 2, 3, 4, 5, 'A', 'B']
 -8 ['B', 'C', 'D', 1, 2, 3, 4, 5, 'A']
 -9 ['A', 'B', 'C', 'D', 1, 2, 3, 4, 5]
-10 ['A', 'B', 'C', 'D', 1, 2, 3, 4, 5]
-11 ['A', 'B', 'C', 'D', 1, 2, 3, 4, 5]
-12 ['A', 'B', 'C', 'D', 1, 2, 3, 4, 5]
-13 ['A', 'B', 'C', 'D', 1, 2, 3, 4, 5]
-14 ['A', 'B', 'C', 'D', 1, 2, 3, 4, 5]
-15 ['A', 'B', 'C', 'D', 1, 2, 3, 4, 5]
-16 ['A', 'B', 'C', 'D', 1, 2, 3, 4, 5]
-17 ['A', 'B', 'C', 'D', 1, 2, 3, 4, 5]
-18 ['A', 'B', 'C', 'D', 1, 2, 3, 4, 5]
-19 ['A', 'B', 'C', 'D', 1, 2, 3, 4, 5]
-20 ['A', 'B', 'C', 'D', 1, 2, 3, 4, 5]
-21 ['A', 'B', 'C', 'D', 1, 2, 3, 4, 5]
-22 ['A', 'B', 'C', 'D', 1, 2, 3, 4, 5]
-23 ['A', 'B', 'C', 'D', 1, 2, 3, 4, 5]
-24 ['A', 'B', 'C', 'D', 1, 2, 3, 4, 5]
-25 ['A', 'B', 'C', 'D', 1, 2, 3, 4, 5]
-26 ['A', 'B', 'C', 'D', 1, 2, 3, 4, 5]
-27 ['A', 'B', 'C', 'D', 1, 2, 3, 4, 5]
-28 ['A', 'B', 'C', 'D', 1, 2, 3, 4, 5]
-29 ['A', 'B', 'C', 'D', 1, 2, 3, 4, 5]
-30 ['A', 'B', 'C', 'D', 1, 2, 3, 4, 5]
-31 ['A', 'B', 'C', 'D', 1, 2, 3, 4, 5]
-32 ['A', 'B', 'C', 'D', 1, 2, 3, 4, 5]
-33 ['A', 'B', 'C', 'D', 1, 2, 3, 4, 5]

When -r is bigger then len(r) then it doesn't work as you would expect.
It gets empty list full list or full list empty list

The same problem is with 34 and -34.

Because you get the same list for r=len(l), r=len(l)*2, ...r=len(l)*n so you would use modulo (r % len(l)) to have value smaller then len(l) and get what you need.

def rotate(l, r):
    r = r % len(l)
    return l[r:]   l[:r]

l = ['A','B','C','D',1,2,3,4,5]

print('len(l):', len(l))

for r in range(0, -34, -1):
    print(f"{r:3}", rotate(l, r))

Result:

len(l): 9
  0 ['A', 'B', 'C', 'D', 1, 2, 3, 4, 5]
 -1 [5, 'A', 'B', 'C', 'D', 1, 2, 3, 4]
 -2 [4, 5, 'A', 'B', 'C', 'D', 1, 2, 3]
 -3 [3, 4, 5, 'A', 'B', 'C', 'D', 1, 2]
 -4 [2, 3, 4, 5, 'A', 'B', 'C', 'D', 1]
 -5 [1, 2, 3, 4, 5, 'A', 'B', 'C', 'D']
 -6 ['D', 1, 2, 3, 4, 5, 'A', 'B', 'C']
 -7 ['C', 'D', 1, 2, 3, 4, 5, 'A', 'B']
 -8 ['B', 'C', 'D', 1, 2, 3, 4, 5, 'A']
 -9 ['A', 'B', 'C', 'D', 1, 2, 3, 4, 5]
-10 [5, 'A', 'B', 'C', 'D', 1, 2, 3, 4]
-11 [4, 5, 'A', 'B', 'C', 'D', 1, 2, 3]
-12 [3, 4, 5, 'A', 'B', 'C', 'D', 1, 2]
-13 [2, 3, 4, 5, 'A', 'B', 'C', 'D', 1]
-14 [1, 2, 3, 4, 5, 'A', 'B', 'C', 'D']
-15 ['D', 1, 2, 3, 4, 5, 'A', 'B', 'C']
-16 ['C', 'D', 1, 2, 3, 4, 5, 'A', 'B']
-17 ['B', 'C', 'D', 1, 2, 3, 4, 5, 'A']
-18 ['A', 'B', 'C', 'D', 1, 2, 3, 4, 5]
-19 [5, 'A', 'B', 'C', 'D', 1, 2, 3, 4]
-20 [4, 5, 'A', 'B', 'C', 'D', 1, 2, 3]
-21 [3, 4, 5, 'A', 'B', 'C', 'D', 1, 2]
-22 [2, 3, 4, 5, 'A', 'B', 'C', 'D', 1]
-23 [1, 2, 3, 4, 5, 'A', 'B', 'C', 'D']
-24 ['D', 1, 2, 3, 4, 5, 'A', 'B', 'C']
-25 ['C', 'D', 1, 2, 3, 4, 5, 'A', 'B']
-26 ['B', 'C', 'D', 1, 2, 3, 4, 5, 'A']
-27 ['A', 'B', 'C', 'D', 1, 2, 3, 4, 5]
-28 [5, 'A', 'B', 'C', 'D', 1, 2, 3, 4]
-29 [4, 5, 'A', 'B', 'C', 'D', 1, 2, 3]
-30 [3, 4, 5, 'A', 'B', 'C', 'D', 1, 2]
-31 [2, 3, 4, 5, 'A', 'B', 'C', 'D', 1]
-32 [1, 2, 3, 4, 5, 'A', 'B', 'C', 'D']
-33 ['D', 1, 2, 3, 4, 5, 'A', 'B', 'C']

BTW:

Without modulo you would have to use for-loops with [1:], [:1] or [-1:],[:-1] - but it need many moves - so it may need more time and memory (but for small list it is not visible).

def rotate(l, r):
    if r >= 0:
        for _ in range(0, r, 1):
            l = l[1:]   l[:1]
    else:
        for _ in range(0, r, -1):
            l = l[-1:]   l[:-1]
        
    return l

l = ['A','B','C','D',1,2,3,4,5]

print('len(l):', len(l))

#for r in range(0, -34, -1):
#    print(f"{r:3}", rotate(l, r))
    
for r in range(0, 34, 1):
    print(f"{r:3}", rotate(l, r))    

The same with one for-loop

def rotate(l, r):

    if r >= 0:
        s = 1
    else:
        s = -1
        
    for _ in range(0, r, s):
        l = l[s:]   l[:s]
        
    return l

CodePudding user response:

If r can be bigger than the list you need to add the modulo operater as @tim-roberts mentioned:

def rotate(l, r):
     r = r % len(l)
     return l[r:]   l[:r]

Outputs

l = [1,2,3]

print(rotate(l,0))
[1, 2, 3]

print(rotate(l,1))
[2, 3, 1]

print(rotate(l,-1))
[3, 1, 2]

print(rotate(l,4))
[2, 3, 1]

print(rotate(l,-4))
[3, 1, 2]

(personally I'd also turn around the rotation direction, using e.g. -r)

  • Related