【问题标题】:Python Slice operator: Negative start combined with Positive stopPython Slice 运算符:负开始与正停止相结合
【发布时间】:2018-07-24 09:07:02
【问题描述】:

我开始使用 Python 并开始关注带有负值的切片运算符。让我用以下代码示例展示我的问题:

a = [1,2,3,4,5]
a[-1]  # a) returns [5], which is obvious
a[-1:1]  # b) returns an empty list [], but why?

所以我从 StackOverflow 上的其他问题中已经知道,切片如何与负开始索引和省略的停止索引一起工作。

但我的问题是:为什么 case b) (negative start and positive stop) 不返回类似[5, 1] 的东西?因为我选择了列表的最后一个元素以及直到第二个元素的所有元素,所以这样会有意义。

如果有人可以向我解释,我会很高兴。 谢谢!

【问题讨论】:

  • 切片不换行。 -1 读作5
  • 感谢您指出这一点。只是一个错字。你是对的!

标签: python python-3.x slice


【解决方案1】:

Python 列表呈线性增长且不是循环的,因为这样的切片不会像您期望的那样(从结束返回开始向前)换行。

由于负索引被读取为-ind + len(lst)-1 在这里代表4。您不可能以积极的步伐从 4 到 1。但是,如果步幅为负,您可以:

In [11]: a[-1:1:-1]
Out[11]: [5, 4, 3]

【讨论】:

    【解决方案2】:

    虽然允许负索引,但 Python 的步幅不是循环,这意味着您不能“超出”最后一个索引。也就是说,“从最后一个元素到第一个元素的每个元素”都是荒谬的。您可能会争辩说它应该导致错误,而是返回空列表[]

    解决方法是使用负步幅,如下所示:

    a[5::-4]  # results in [5, 1]
    

    这里我们从第 5 个元素开始,继续遍历所有元素(两个 :: 之间没有数字)并一次跳转 -4(由于减号而向后)元素。

    【讨论】:

    • 如果你在月球上行走,即向后跨步,这不是没有意义的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 2016-04-03
    相关资源
    最近更新 更多