我了解到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 回答
areas[-4:0]
转换为areas[len(areas) - 4: 0]
,它实际上是从较高的索引切换到较低的索引 . 从语义上讲,这没有多大意义,结果是一个空列表 .你正在寻找:
如果未指定最后一个索引,则假定您切片直到最后 .
顺便说一下,当你反向切片时,指定
0
会有意义 . 例如,发生完全有效 . 在这里,您从
len(areas) - 4
切换到(但不包括)索引0
,反过来 .首先,我想知道如何使用区域[-4:0]访问切片,它应该返回一个空列表 .
https://repl.it/repls/CarefreeOilyLine
你可以使用应该返回的区域[-4:]
实际上,你可以认为
-4
就像len(areas) - 4
一样并且0不能同时表示0和len(区域) - 0 . 当然,它适用于
areas[-4:len(areas)]
.0
不是负数,这就是为什么它总是引用最左边的元素 .如果您正在硬编码一个没有问题的单个切片,因为您可以省略正确的边界,如
areas[-4:]
但是如果在运行时计算边界怎么办?
你发现这不起作用 .
您经常会听到只添加列表的长度:
但这并不总是有效:
所以这里有一个成语在几个案例中起作用:
但你也可以打破这个:
我们从中学到了什么?负指数适用于硬编码,但在动态使用时需要小心 . 在程序中,避免负面语义并始终使用
max(0, index)
可能是最安全的 .