我怎样才能切分列表,直到消极索引结束
我了解到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)
可能是最安全的。
上一篇: How can I slice a list till end with negative indexes
下一篇: Python Slice operator: Negative start combined with Positive stop