为什么我在Python中的负面切片不起作用?

时间:2012-12-02 18:59:33

标签: python-2.7

我是Python的新手并且已经阅读了几个有关切片的教程,但是我在空闲中运行的示例似乎没有返回我期望的内容。例如,我已将以下列表分配给变量a

a=[0,1,2,3,4,5,6,7,8,9]

现在我理解切片为[number I want to include:number up to and don't want to include:step]

因此,如果我a[1],我会期待1。如果我a[1:3],则为1,2

现在,如果我a[-1],我会9但是如果我a[-1:-5],我什么也得不到。我所看到的只是[]。这是为什么?我希望看到9,8,7,6

我在Windows 7 Professional上运行Python 2.7

2 个答案:

答案 0 :(得分:2)

在这种情况下,您需要添加step参数才能获得所需内容:

In [1]: a=[0,1,2,3,4,5,6,7,8,9]

In [2]: a[-1:-5:-1]
Out[2]: [9, 8, 7, 6]

如果你想节省更多的空间,你可以省略第一个参数:

In [3]: a[:-5:-1]
Out[3]: [9, 8, 7, 6]

Python处理“否定”切片的方式是将对象的len添加到负数。所以当你说a[-1:-5]时,它基本上是a[(-1+10):(-5+10)],等于a[9:5],而且start / end指的是两者之间的所有字符(通过列表“向前”移动,它不会返回任何内容(因此您的空白列表)。您可以通过执行以下操作来查看此内容:

In [5]: a[-5:9]
Out[5]: [5, 6, 7, 8]

In [6]: a[5:9]
Out[6]: [5, 6, 7, 8]

-5 + 10 = 5开始,您会得到与负和正指数相同的结果。

提供-1 step参数告诉它从第一个元素开始,但从开始位置向后移动。

答案 1 :(得分:2)

我认为将拼接视为不是数字本身,而是指向指数的指针是很好的。

                      +---+---+---+---+---+---+---+---+---+---+
                      | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
                      +---+---+---+---+---+---+---+---+---+---+
                        0   1   2   3   4   5   6   7   8   9
                      -10  -9  -8  -7  -6  -5  -4  -3  -2  -1

因此,当您切片a[-1:-5]时,您将从索引9开始,然后转到索引5.在该切片中没有任何内容。如果你a[-5:-1],那么你将从索引5开始到索引9。

RocketDonkey是对的 - 如果你想要[9, 8, 7, 6],你需要倒退。