Python Slice运算符:负启动与Positive stop结合使用

时间:2018-02-13 21:51:02

标签: python python-3.x slice

我开始使用Python并开始关注具有负值的切片运算符。让我用以下代码示例来说明我的问题:

a = [1,2,3,4,5]
a[-1]  # a) returns [5], which is obvious
a[-1:1]  # b) returns an empty list [], but why?

所以我在StackOverflow上的其他问题中已经知道,切片如何与负起始索引和省略的停止索引一起使用。

但我的问题是:为什么案例b)(负启动和积极停止)不会返回[5, 1]之类的内容?因为我选择列表的最后一个元素以及第二个元素的所有内容,所以这样才有意义。

如果有人能向我解释,我会很高兴。 谢谢!

2 个答案:

答案 0 :(得分:2)

Python列表线性增长并且不是循环的,因为切片不会像预期的那样换行(从结束回到开始向前)。

由于负面指数被视为-ind + len(lst)-1此处代表4。你不可能以积极的步伐从4到1。但是,如果采取消极的步伐,您可以:

In [11]: a[-1:1:-1]
Out[11]: [5, 4, 3]

答案 1 :(得分:0)

虽然允许使用负数索引,但Python的步幅不是 cyclic ,这意味着你不能超越最后一个索引。也就是说,“从最后一个元素开始直到第一个元素”的每个元素都是荒谬的。您可能会认为它应该导致错误,而是返回空列表[]

解决方法是使用负步幅,如下所示:

a[5::-4]  # results in [5, 1]

这里我们从第5个元素开始,继续遍历所有元素(两个::之间没有数字)和一次跳跃-4(向后由于减号)元素。