我了解到Python列表也可以使用负索引遍历,所以我尝试使用负索引对列表进行切片/子列表,但我不能将其切片直到结束。
我的清单是:
areas = ["hallway", 11.25, "kitchen", 18.0, "living room", 20.0, "bedroom", 10.75, "bathroom", 9.50]
知道切片语法是[start:end]
并且没有计算结束索引,我做了upstairs = areas[-4:0]
但是这并没有给我列表的最后一个元素。
答案 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)
可能是最安全的。