2013-03-23 20 views
1

考慮下面的代碼:功能python列表切片真的不對稱嗎?

>>> a = [0, 1, 2] 
>>> for i in range(len(a)): 
>>> print a[0:i] 

[] 
[0] 
[0, 1] 

然而,當我翻轉代碼,以切片從列表中的另一端,它不再起作用:

>>> for i in range(len(a)): 
>>> print a[-i:] 

[0, 1, 2] 
[2] 
[1, 2] 

只有這樣,才能使第二件作品的代碼似乎是顛倒清單,以第一種方式做,並在打印之前將每件作品顛倒過來。有一個更好的方法嗎?我有時使用這種類型的循環,我希望我的代碼儘可能乾淨。

編輯:在兩個循環中,我從左到右迭代。如果我翻轉迭代的方向以及第二個循環,它也可以工作。如果我翻轉迭代的方向,爲第一環,它也有同樣的打嗝的第二環:

>>> for i in range(len(a)): 
>>> print a[i-1::-1] 

[2, 1, 0] 
[0] 
[1, 0] 

回答

8

第一次迭代,你是切片爲-0,這是一樣的從0切片。只有第二次迭代纔會分爲-1,然後-2

也許你可以在負指數使用範圍開始:

for i in range(-len(a), 0): 
    print a[-i:] 
+3

Arg - 您什麼時候出現在這裏?現在我該怎麼去FGITW什麼? (+1 btw) – mgilson 2013-03-23 23:03:52

+0

他藏在陰影裏。 xD – TerryA 2013-03-23 23:04:04

+0

絕對不能相信毛氈娃娃忍者.. – 2013-03-23 23:04:32

0

反切片不可能完全對稱的Python因爲基於0的索引。具體來說,不可能將-0與0區分開來。但是基於0的索引數組中的對稱訪問用例將決定如果第0項從左邊開始第一項,則第-0項(即,負0)是第一個從右邊開始的,但由於0和-0是同一個實體,這就產生了一個問題。

考慮名單的指數的兩個方向:

轉發:第一項是在位置0,第二個項目在位置1,...,最後一個項目位置n-1

向後:第一項是在-1位置,第二在-2,...,在位置的最後一個項目-n

負指數表示法因此,對於(長度索引)一個速記collection[-i] == collection[len(collection) - i]

或者,並排,索引是:

[0, 1, 2,...,n-1] 
[-n,..., -3, -2, -1 ] 

當上述兩個指標的實際上是相同的。

要執行對稱操作時,你的切片操作者需要正確地解釋這種索引方案:

原始切片a[0:i] ==從左端i個元素(從0),用1 ==步長a[0:i:1]

反向切片:i個元素從右端(在-1)的-1步長。

因此,從另一端的正確片會a[-1:-1-i:-1]

注意,這裏的停止值是我的消極,-1偏移佔-1型反轉索引,它是必要的,因爲我們正在生成使用基於前向的列表(例如範圍函數)。

a = range(3) # [0,1,2] 
for i in range(len(a)): 
    # forward case, next to backward case 
    print a[:i], a[-1:-1-i:-1] 
# [] [] 
# [0] [2] 
# [0, 1] [2, 1]