簡體   English   中英

如何左右旋轉列表?

[英]How can I rotate a list right and left?

我一直在嘗試在 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我得到 output 為

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

但實際的 output 是這樣的:

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

誰能告訴我該怎么做?

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

結果:

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 ,您將不得不使用帶有[1:][:1][-1:][:-1] for循環 - 但它需要很多動作 - 所以它可能需要更多時間和 memory (但對於小列表是不可見的)。

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循環相同

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

如果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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM