如何将列表切片到负指数结束

时间:2018-03-14 17:54:48

标签: python list slice sublist

我了解到Python列表也可以使用负索引遍历,所以我尝试使用负索引对列表进行切片/子列表,但我不能将其切片直到结束。

我的清单是:

areas = ["hallway", 11.25, "kitchen", 18.0, "living room", 20.0, "bedroom", 10.75, "bathroom", 9.50]

知道切片语法是[start:end]并且没有计算结束索引,我做了upstairs = areas[-4:0]但是这并没有给我列表的最后一个元素。

3 个答案:

答案 0 :(得分:3)

areas[-4:0]转换为areas[len(areas) - 4: 0],这有效地从较高的索引切换到较低的索引。从语义上讲,这没有多大意义,结果是一个空列表。

您正在寻找:

>>> areas[-4:]
['bedroom', 10.75, 'bathroom', 9.5]

如果未指定最后一个索引,则假定您切片直到最后。

顺便说一下,当你反向切片时,指定0会有意义。例如,

>>> areas[-4:0:-1]
['bedroom', 20.0, 'living room', 18.0, 'kitchen', 11.25]

发生完全有效。在这里,您从len(areas) - 4切换到(但不包括)索引0,反过来。

答案 1 :(得分:0)

首先,我想知道如何使用区域[-4:0]访问切片,它应该返回一个空列表。

https://repl.it/repls/CarefreeOilyLine

你可以使用区域[-4:] 哪个应该返回

> areas[-4:]
=> ['bedroom', 10.75, 'bathroom', 9.5]

实际上,您可以将-4视为len(areas) - 4

> areas[len(areas)-4:]
=> ['bedroom', 10.75, 'bathroom', 9.5]
> areas[0:-4]
=> ['hallway', 11.25, 'kitchen', 18.0, 'living room', 20.0]
> areas[0:len(areas)-4]
=> ['hallway', 11.25, 'kitchen', 18.0, 'living room', 20.0]
> areas[0:6]
=> ['hallway', 11.25, 'kitchen', 18.0, 'living room', 20.0]

和0不能同时表示0和len(区域) - 0。 当然,它适用于areas[-4:len(areas)]

答案 2 :(得分:0)

0不是负数,这就是为什么它总是引用最左边的元素。

如果您正在硬编码没有问题的单个切片,因为您可以像areas[-4:]

一样省略右边界

但是如果在运行时计算边界怎么办?

>>> for left in range(-8, -3, 2):
...     right = left + 4
...     print(areas[left:right])
... 
['kitchen', 18.0, 'living room', 20.0]
['living room', 20.0, 'bedroom', 10.75]
[]

你发现这不起作用。

您经常会听到只添加列表的长度:

>>> for left in range(-8, -3, 2):
...     right = left + 4
...     print(areas[len(areas)+left:len(areas)+right])
... 
['kitchen', 18.0, 'living room', 20.0]
['living room', 20.0, 'bedroom', 10.75]
['bedroom', 10.75, 'bathroom', 9.5]

但这并不总是有效:

>>> for left in range(-12, -3, 2):
...     right = left + 4
...     print(areas[len(areas)+left:len(areas)+right])
... 
[]
['hallway', 11.25, 'kitchen', 18.0]
['kitchen', 18.0, 'living room', 20.0]
['living room', 20.0, 'bedroom', 10.75]
['bedroom', 10.75, 'bathroom', 9.5]

所以这是一个在几个案例中有效的习语:

>>> for left in range(-12, -3, 2):
...     right = left + 4
...     print(areas[left or None:right or None])
... 
['hallway', 11.25]
['hallway', 11.25, 'kitchen', 18.0]
['kitchen', 18.0, 'living room', 20.0]
['living room', 20.0, 'bedroom', 10.75]
['bedroom', 10.75, 'bathroom', 9.5]

但你也可以打破这个:

>>> for left in range(-12, -1, 2):
...     right = left + 4
...     print(areas[left or None:right or None])
... 
['hallway', 11.25]
['hallway', 11.25, 'kitchen', 18.0]
['kitchen', 18.0, 'living room', 20.0]
['living room', 20.0, 'bedroom', 10.75]
['bedroom', 10.75, 'bathroom', 9.5]
[]

我们从中学到了什么?负指数适用于硬编码,但在动态使用时需要小心。 在程序中,避免负面语义并始终使用max(0, index)可能是最安全的。