2012-05-28 18 views
4

通常扭轉列表中選擇一個應做到以下幾點:切片VS跨越倒車時串

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

但不是這樣的確切語法:

list[<start>:<end>:<stop>] 

,如果我不舉一個可選參數的默認值如下(糾正我,如果我錯了:

<start> = 0(Beginning of list) 
<end> = 5(Length of list) 
<step> = 1 

所以,如果我給可選參數,它應該實際上產生相同的結果:

>>>>l[0:5:-1] 
>>>>[] 

而是我得到一個空列表(我知道爲什麼出現這種情況),但什麼是在第一種情況下所採取的Python的默認值應該在0與5默認和生產什麼,或者是[:: - 1]列表不同的[開始:結束:STOP]

+1

敢肯定你的意思是'列表[啓動:停止:步]'他們稱之爲在[Python文檔](HTTP://docs.python。 org/library/functions.html#slice) – mayhewr

回答

4

l[::-1]相當於l[slice(None,None,-1)],其中slice([start], stop[, step])返回slice對象。 考慮以下幾點:

>>> slice(None,None,-1).indices(5) 
(4, -1, -1) 
>>> slice(None,None,1).indices(5) 
(0, 5, 1) 

這是你使用擴展索引語法時訪問列表,即l[start:stop:step]看到確切行爲。

>>> l[::-1] 
[5, 4, 3, 2, 1] 
>>> l[slice(None,None,-1)] 
[5, 4, 3, 2, 1] 

...但在第一種情況下所採取的Python的默認值?

用於開始/停止(如果未提供)的值是基於所述號碼,如果索引(列表的長度)以及的step值。具體而言,看到的CPython source for the slice objectObjects/sliceobject.c

if (r->start == Py_None) { 
    *start = *step < 0 ? length-1 : 0; 
} else { 
    /* .... */ 
} 

if (r->stop == Py_None) { 
    *stop = *step < 0 ? -1 : length; 
} else { 
    /* .... */ 
} 
+0

因此,python實際上取決於步驟的值,而分配默認值? –

+0

是的,它會查看列表的長度和步驟。 –

+0

@KartikAnand有關如何計算默認值的詳細信息,請參閱更新。 –

0

的開始和結束,如果你在列表中倒着走逆轉,試試這個:

l[5:0:-1] 

有趣的是,它只切片5個元素的4(因爲「結束」應該是一個過去的結束),而這不工作:

l[5:-1:-1] 

這確實你想等什麼:

l[5::-1] 
+0

所以實際上python正在玩我的論點吧?不應該默認值是「默認」,不會因爲你的論點而改變嗎? :) –

+0

雖然它們並不是真正的默認值,但它們是從上下文中推斷出來的。 – poke

+0

@Brendan Long l [5:-1:-1]不起作用,原因是l [0:5:-1]不起作用。它從5開始減去1,它得到一個索引「 4「。但是由於索引」4「=索引」-1「並且不應該包括索引」-1「,所以它不起作用。 –

2

如果你的步驟是負的,而不是你在列表的末尾開始......你可以用負指數來做到這一點。

嘗試:

l[-1:-6:-1]