我怎样才能切分列表,直到消极索引结束

我了解到Python列表也可以使用负向索引遍历,因此我试图使用负向索引对列表进行切片/子列表,但是我无法切片到最后。

我的清单是:

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

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


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 ,反过来。


首先,我想知道如何使用区域[-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)]


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

链接地址: http://www.djcxy.com/p/26767.html

上一篇: How can I slice a list till end with negative indexes

下一篇: Python Slice operator: Negative start combined with Positive stop