3

我是 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

4

2 回答 2

3

在这种情况下,您需要添加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对象的 then 加到负数上。因此,当您说 In 时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.

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

于 2012-12-02T19:02:56.277 回答
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],你需要后退一步。

于 2012-12-02T19:18:28.890 回答