【问题标题】:Python range slicing and indexing behavior [duplicate]Python范围切片和索引行为[重复]
【发布时间】:2014-02-24 05:41:31
【问题描述】:

在 Python 中,我想知道为什么切片会以它们的方式工作。为什么 Guido van Rossum 定义 a[start:end] 包含 a[start] a[end],或者如标题所示,为什么 a[0:1] 只包含第一个元素而不包含前两个?

这似乎是从 MATLAB 的索引行为退一步。

编辑:我问这个问题的原因是a[0:0] 是空的,这令人困惑。但是我没有设计流行的语言,所以我知道什么。

【问题讨论】:

  • 因为不包括结束索引与从 0 开始的索引完全吻合。 range(10) 产生从 0 到 9 的索引,使用 sequence[:len(sequence)] 进行切片工作,等等。
  • 我注意到 MATLAB 使用基于 1 的索引,这意味着封闭式索引是有意义的。但是,您不会在 MATLAB 中获得我们在 Python 中的 a == a[:end] + a[end:] 不变量。

标签: python slice


【解决方案1】:

quoteGuido van Rossum 本人:

[...] 我被半开音程的优雅所左右。特别是 不变的是,当两个切片相邻时,第一个切片的结尾 index 是第二个切片的起始索引太漂亮了 忽视。例如,假设您将一个字符串拆分为三个部分 索引 i 和 j - 部分将是 a[:i]、a[i:j] 和 a[j:]。

【讨论】:

  • 啊……好吧,所以有一些方法可以解决这个疯狂:)
  • +1,你应该把这个添加到这个重复的问题中
  • @jonrsharpe,好主意。完成!
【解决方案2】:

Python 索引是从 0 开始的。通过排除结束值,大多数切片和range()操作可以自然地反映切片或产生的项目的数量,同时仍包括索引0。

因此,range(10) 产生 10 个元素,从 0 到 9。使用 sequence[:1] 切片产生 1 个元素,索引为 0。

此外,不包括结束索引更容易使用相同的值作为下一部分的开始。因此sequence[:i] + sequence[i:] 从两个切片重新创建sequence,而无需调整i

【讨论】:

    【解决方案3】:

    a[start:end-1] 允许您使用a[0:len(a)]

    它适用于所有其他功能,例如range() 等。

    【讨论】:

    • 在那种情况下你肯定会一直使用[:] 吗?但是关于使用len(a) 作为stop 的观点是有效的,例如对于range
    • @jonrsharpe 你说得对,但这只是一个他容易理解的例子。
    猜你喜欢
    • 2013-11-30
    • 2021-08-25
    • 1970-01-01
    • 2017-05-17
    • 2017-01-16
    • 1970-01-01
    • 2015-02-23
    • 2021-06-21
    • 1970-01-01
    相关资源
    最近更新 更多