【问题标题】:How can I rotate a list right and left?如何左右旋转列表?
【发布时间】:2021-12-02 07:25:10
【问题描述】:

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

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

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

print(rotate(l, r))

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

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

但实际输出是这样的:

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

谁能告诉我该怎么做?

【问题讨论】:

  • r = -34 作为轮换信息的含义是什么?
  • 也许可以看到l[-34:] 和l[:-34]。如果您的值大于len(l),那么您可能会得到与预期不同的结果,您可能需要获得该值的modulo。
  • r=1 或 r=-1 会发生什么
  • 不,对于更大的值,您只需要r = r % len(l)。
  • @furas 不仅更简单,而且性能要好得多。

标签: python list function


【解决方案1】:

首先你可以使用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))

你看到了

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]

当-r 大于len(r) 时,它不会像您预期的那样工作。
它得到empty list + full list 或full 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))

结果:

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']

顺便说一句:

如果没有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))    

与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

【讨论】:

    【解决方案2】:

    如果r 可以大于您需要添加模运算符的列表,如@tim-roberts 所述:

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

    输出

    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]
    

    (我个人也会转向旋转方向,例如使用-r)

    【讨论】:

    • "(我个人也会转向旋转方向,例如使用 -r)" 嗯?具体在哪里?
    • 这只是个人爱好。对我来说,正整数“向前”旋转(列表中的索引增加但最后一项)。在返回行中使用-r 而不是r 可以做到这一点。
    • 啊,我明白你的意思了,你想改变r的符号对应的旋转方向
    猜你喜欢
    • 1970-01-01
    • 2017-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多