2015-12-04 113 views
1

我想顛倒python中的列表切片,但它返回一個空列表。但是當我嘗試整個列表時,它工作正常。我在這裏錯過了什麼嗎?顛倒Python中的列表切片

l=[1,2,3,4,5,6,7,8] 
l[::-1]=[8, 7, 6, 5, 4, 3, 2, 1]  <<< This worked fine. 

l[2:5]=[3, 4, 5] 
l[2:5:-1]=[]  <<< Expecting [5,4,3] here. 

任何線索?

+1

'l [2:5] [:: - 1]'在不同的方括號內進行操作。 –

+1

你需要'l [4:1:-1]'使用負數步驟。 -1沒有反轉,它正在步進 –

+0

@PadraicCunningham爲什麼這不工作,雖然作爲'l [2:5:2]'沒有工作我很好奇 – EdChum

回答

5

語法總是[start:end:step]所以如果你倒退,你的開始需要比結束更大。另外請記住,它包括開始和排除結束,所以你需要在開始和結束交換後減去1。

l[5:2:-1]= [6, 5, 4] 
l[4:1:-1]= [5, 4, 3] 
0

切片符號是[start:stop:step]。這意味着「從start開始,然後增加step,直到你到達end。」它類似於此構造:

counter = 0 
stop = 10 
step = 1 
while counter < stop: 
    print(counter) 
    counter += step 

這將產生,符合市場預期,0通過9

現在想象一下,如果我們與您正在使用的值試了一下:

counter = 2 
stop = 5 
step = -1 
while counter < stop: 
    print(counter) 
    counter += step 

如果我們實際執行這一點,將打印2,再加入-1到拿到1,然後打印1並添加-1以得到0,那麼它永遠是-1-2等等。您將不得不手動停止執行以停止無限循環。

如果你離開startstop空,如[:4][::-1],這表明該序列的開頭或結尾,由step確定。 Python將以正step前進,並向後以負step(試圖使用的step產生錯誤)。

>>> l[2::] 
[3, 4, 5, 6, 7, 8] 
>>> l[2::-1] 
[3, 2, 1] 
>>> l[:2:] 
[1, 2] 
>>> l[:2:-1] 
[8, 7, 6, 5, 4] 

如果指定了startendstep可能無法正常工作(空step默認爲1),Python會簡單地返回一個空序列。