如何左右旋转列表?

RAK*_*RSH 2 python function list

我一直在尝试在 python 中左右旋转列表

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

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

print(rotate(l, r))
Run Code Online (Sandbox Code Playgroud)

但如果我给出输入列表为['A','B','C','D',1,2,3,4,5]并且r = -34我得到的输出为

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

Run Code Online (Sandbox Code Playgroud)

但实际输出是这样的:

['C', 'D', 1, 2, 3, 4, 5, 'A', 'B']
Run Code Online (Sandbox Code Playgroud)

谁能告诉我该怎么做?

fur*_*ras 5

首先,您可以使用print()并测试它的不同值

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))
Run Code Online (Sandbox Code Playgroud)

你看

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]
Run Code Online (Sandbox Code Playgroud)

-r更大时,len(r)它就不会按您的预期工作。
它得到empty list+full listfull list+empty list

+34和 也有同样的问题-34

因为您得到r=len(l), r=len(l)*2, ...的相同列表r=len(l)*n,所以您可以使用modulo( r % len(l)) 使值更小len(l)并获得您需要的内容。

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))
Run Code Online (Sandbox Code Playgroud)

结果:

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']
Run Code Online (Sandbox Code Playgroud)

顺便提一句:

如果没有modulo,您将不得不使用for-loops 与[1:],[:1][-1:], [:-1]- 但它需要很多动作 - 所以它可能需要更多的时间和内存(但对于小列表它是不可见的)。

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))    
Run Code Online (Sandbox Code Playgroud)

for与单循环相同

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
Run Code Online (Sandbox Code Playgroud)