2017-04-19 72 views
3

我有一個列表,我想從中抽取一個子切片。用兩行代碼,這是在python中切換部分列表

mylist = [...] 
mysublist = mylist[begin:end] 
mysublist = mysublist[::-1] 

是否有一個切片符號在一行中獲得相同的效果?此

mysublist = mylist[end:begin:-1] 

是不正確的,因爲它包括end和排除begin元件。這

mysublist = mylist[end-1:begin-1:-1] 

begin是0,因爲begin-1現在-1這被解釋爲mylist最後一個元素的索引失敗。

回答

4

使用None如果begin0

mysublist = mylist[end - 1:None if not begin else begin - 1:-1] 

None手段 '默認',同樣的事情省略值。

你總是可以把條件表達式在單獨一行:

start, stop, step = end - 1, None if not begin else begin - 1, -1 
mysublist = mylist[start:stop:step] 

演示:

>>> mylist = ['foo', 'bar', 'baz', 'eggs'] 
>>> begin, end = 1, 3 
>>> mylist[end - 1:None if not begin else begin - 1:-1] 
['baz', 'bar'] 
>>> begin, end = 0, 3 
>>> mylist[end - 1:None if not begin else begin - 1:-1] 
['baz', 'bar', 'foo'] 
1

您可以隨時使用功能轉換的功率:

mysublist = list(reversed(mylist[begin:end])) 
+0

'reversed()'不返回一個列表,它返回一個* iterator *。 –

+0

@MartijnPieters你是對的 – enedil

2

你可以簡單地將你的兩條線折成一條:

mysublist = mylist[begin:end][::-1] 
+0

但是,這仍然會創建*兩個*列表對象。 –

+1

@MartijnPieters它,但這取決於你想要優化。任務是「一條線」,所以我認爲可讀性勝過效率。您使用三元運算符的解決方案在技術上是無懈可擊的,但我會發現它是不可讀的。 – jez