Python列表/子列表选择-1怪异

时间:2010-08-10 16:23:59

标签: python list sublist

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

所以我有一个数字列表

ls = range(1000)

列表的最后一个元素当然是ls[-1]但是如果我拿一个子列表以便从中间点到结束我会得到所有内容

ls[500:-1]

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

ls[0:10]

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

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

6 个答案:

答案 0 :(得分:74)

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

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

答案 1 :(得分:14)

如果你想获得包含最后一个元素的子列表,你会在冒号后留空:

>>> 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]

答案 2 :(得分: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在结尾处不包括切片)。

答案 3 :(得分:2)

-1在序列被向后读取的意义上并不特殊,而是包围了两端。这样减1表示零减1,不包括(对于正步值,序列从“从左到右”读取。

因此,对于i = [1, 2, 3, 4]i[2:-1]表示从第二项到开头减一(或“,从左到右”) ,这导致[3]。 第-1个元素或元素 0向后1 是最后一个4,但由于它是独占的,我们得到3。

我希望这有点可以理解。

答案 4 :(得分: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

答案 5 :(得分:1)

切片时;

ls[y:x]  

从元素y获取切片但不包括x。当您使用否定索引时,它相当于使用

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

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