如何使用负索引将列表分割至末尾

2024-04-29 16:37:24 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我的名单是:

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

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


Tags: 元素列表语法切片startendroom名单
3条回答

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

https://repl.it/repls/CarefreeOilyLine

您可以使用区域[-4:] 它应该返回

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

实际上,您可以将-4看作len(areas) - 4之类的

^{pr2}$

和0不能同时表示0和len(面积)-0。 当然,它与areas[-4:len(areas)]一起工作。在

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

你发现这行不通。在

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

^{pr2}$

但这也并不总是有效的:

>>> 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)可能是最安全的。在

^{cd1>}转换为^{cd2>},这是从更高的索引有效地分割到更低的。从语义上讲,这没有多大意义,结果是一个空列表。

您要寻找的是:

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

当没有指定最后一个索引时,假设您将切片到最后一个索引。


作为一个旁白,当您反向切片时,指定^{{cd3>}是有意义的。例如

^{pr2}$

刚好是完全有效的。这里,您可以从^{cd4>}向下切片到(但不包括)索引^{cd3>},相反。

相关问题 更多 >