2010-08-10 21 views
15

所以我一直在玩python,發現有些奇怪的東西。從列表中選擇的-1的語義似乎不一致。Python列表/子列表選擇-1奇怪

所以我有一個數字

ls = range(1000) 

列表的最後一個元素的列表,如果當然ls[-1]的,但如果我帶的一個子表,讓我得到一切從說中點到最後我會做

ls[500:-1] 

但是這並沒有給我含在列表中的最後一個元素的列表,而是一直到最後一個元素都包含一個列表。但是,如果我這樣做

ls[0:10] 

我也弄含第十要素(這樣的選擇應該是包容性的),那麼爲什麼它不適合-1工作清單。

我當然可以做ls[500:]ls[500:len(ls)](這將是愚蠢的)。我只是想知道與-1的交易是什麼,我意識到我並不需要它。

回答

50

list[first:last],last不包括在內。

第10個元素是ls[9],在ls[0:10]中沒有ls[10]

4

我得到一致的行爲這兩種情況下:

>>> ls[0:10] 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
>>> ls[10:-1] 
[10, 11, 12, 13, 14, 15, 16, 17, 18] 

但是請注意,該列表的第十代元素的索引爲,由於該表是0索引。這可能是你的掛機地點。

換句話說,[0:10]不會從索引0-10開始,它實際上從0到第10個元素(這會得到索引0-9,因爲在切片的末尾不包含10) 。

1

對我來說這似乎很相符。積極指數也不包括在內。我認爲你做錯了。記住range()也是非包含的,並且Python數組是0索引的,下面是一個python會話示例:

>>> d = range(10) 
>>> d 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
>>> d[9] 
9 
>>> d[-1] 
9 
>>> d[0:9] 
[0, 1, 2, 3, 4, 5, 6, 7, 8] 
>>> d[0:-1] 
[0, 1, 2, 3, 4, 5, 6, 7, 8] 
>>> len(d) 
10 
1

切片數組;

ls[y:x] 

從元素y開始切片,但不包括x。當您使用負索引它等同於使用

ls[y:-1] == ls[y:len(ls)-1] 

所以這樣的片將高達最後一個元素,但不包括它(如每片)

2

-1 ISN在序列被反向讀取的意義上,它並不特別,它相當於包裹着末端。這樣減1意味着零減1,排他(並且,對於正階躍值,序列從「從左到右」被讀取。

所以對於i = [1, 2, 3, 4]i[2:-1]指從項目2 開始減一(或,「圍繞在端」),這導致[3]。 的-1th元素,或元素0向後1是最後4,但因爲它是獨特的,我們得到了3

我希望這是有點理解的。

10

如果你想獲得一個子列表,包括最後一個元素,你冒號後留空:

>>> ll=range(10) 
>>> ll 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
>>> ll[5:] 
[5, 6, 7, 8, 9] 
>>> ll[:] 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]