首页 文章

如何将列表切片到负指数结束

提问于
浏览
1

我了解到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 回答

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

  • 3

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

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

相关问题