【问题标题】:Negative Bounds for Slice Operator [duplicate]切片运算符的负边界
【发布时间】:2018-11-25 05:50:09
【问题描述】:

我是 python 新手,每个新手都会遇到的事情之一就是切片运算符。我有一个清单:

li=[1,2,3,4,5,6,7]

根据我的理解,调用li[:-1] 与调用li[0:-1] 相同,但是当以负面步骤使用它时,事情并没有像我想象的那样工作。所以我的问题是为什么

print(li[:-3:-2]) # is 7

但结果

print(li[0:-3:-2]) # is []

期待在这种情况下如何处理负面步骤的一些解释。

【问题讨论】:

  • 我不知道这是什么机制 - 但如果您需要解决方法,使用 li[:-3][::-2] 而不是 li[:-3:-2] 会产生(预期的)[4, 2]
  • @GreenCloakGuy 我更感兴趣的是找到一个正确的解释而不是解决方法:)

标签: python slice


【解决方案1】:

关键是缺少的(或无)起始值并不总是自动设置为0。请阅读sequence operations中的注释5 for s[i:j:k]

如果 i 或 j 被省略或没有,它们将成为“结束”值(结束 取决于 k 的符号)

为简化情况,请考虑负步骤 -1 而不是 -2。 Step -1 常用于反转列表。

>>> print(li[None:-3:-1])
[7, 6]
>>> print(li[0:-3:-1])
[]

第一个示例显示,切片的真正“最终值”是什么。

【讨论】:

    【解决方案2】:

    所以,你的名单是li=[1,2,3,4,5,6,7]

    首先,了解切片中究竟发生了什么。

    不使用 step 就无法向后切片

    举个例子,我们不想打印[7, 6, 5, 4, 3, 2],我们不能使用li[-1:0]来做到这一点。因为,切片不能按规定向后倒退(我们不能从索引-1倒退到0),并且将返回空列表[]。(我们必须使用li[-1:0:-1]来执行此操作)

    所以这里发生的是:

    您有一个列表li[x:y],使用负步骤会将索引交换为li[y:x]。(一旦完成索引交换,您应该将其视为正步骤)然后打印输出 w.r.t。您提供的步骤(仅幅度)。

    现在,我上面提到的所有内容似乎都没有用,但它会帮助您理解下一部分。

    所以,说到你的问题,当你写li[0:-3:-2] 时,首先交换索引。所以,它与li[-3:0:2] 相同。并且正如我上面所说,如果不使用负步骤,我们不能向后退(索引-30),所以它返回空列表。

    但是,当您输入 li[:-3:-2] 时,它会交换索引并变为 li[-3::2],我们现在很容易知道输出将是什么 ([7])。

    因此,不要将[:-3:-2] 中的空格视为0,而是将其视为左端。(为了更好地理解)

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2016-03-30
      • 2018-09-11
      • 1970-01-01
      • 2010-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多