48

所以我一直在玩 python 并注意到一些似乎有点奇怪的东西。从列表中选择的语义-1似乎不一致。

所以我有一个数字列表

ls = range(1000)

如果当然是列表的最后一个元素,ls[-1]但是如果我采用它的子列表,以便我得到从中点到结尾的所有内容,我会做

ls[500:-1]

但这并没有给我一个包含列表中最后一个元素的列表,而是一个包含直到最后一个元素的所有内容的列表。但是,如果我这样做

ls[0:10]

我得到一个包含第十个元素的列表(因此选择器应该包含在内),为什么它不适用于-1.

我当然可以做ls[500:]ls[500:len(ls)](这很愚蠢)。我只是想知道与 -1 的交易是什么,我意识到我在那里不需要它。

4

6 回答 6

109

list[first:last]last不包括在内。

第 10 个元素是ls[9]ls[0:10]其中没有ls[10]

于 2010-08-10T16:28:25.290 回答
28

如果要获取包含最后一个元素的子列表,请在冒号后留空:

>>> 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]
于 2013-05-09T08:09:28.330 回答
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]

但请注意,列表的第十个元素位于索引9处,因为该列表是 0 索引的。那可能就是你挂断电话的地方。

换句话说,[0:10]不是从索引 0-10 开始,它实际上是从 0 到第十个元素(这让你得到索引 0-9,因为 10 在切片的末尾不包括在内)。

于 2010-08-10T16:29:55.907 回答
3

切片数组时;

ls[y:x]  

从元素 y 到但不包括 x 的切片。当您使用负索引时,它等同于使用

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

所以它所以切片将直到最后一个元素,但它不会包含它(根据切片)

于 2010-08-10T16:30:29.480 回答
3

-1 在序列被向后读取的意义上并不特殊,它更确切地说是环绕末端。这样减一意味着零减一,排他(并且,对于正步长值,序列“从左到右”读取。

因此,对于i = [1, 2, 3, 4],i[2:-1]表示从第二项到开头减去一(或者,“大约到结尾”),结果为[3]. 第 -1 个元素,或元素0 向后 1是最后一个4,但由于它是独占的,所以我们得到 3。

我希望这有点可以理解。

于 2010-08-10T16:40:52.027 回答
3

这对我来说似乎很一致;正指数也不包括在内。我认为你做错了。请记住 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
于 2010-08-10T16:30:07.700 回答