如何实现Python中的切片操作

内容来自 DOC https://q.houxu6.top/?s=如何实现Python中的切片操作

Python中的切片符号是如何工作的?也就是说,当我编写代码像a[x:y:z]a[:]a[::2]等时,我如何理解哪些元素最终会进入切片?请在适当的地方包括参考资料。


有关切片符号设计决策的更多讨论,请参见 为什么切片和范围上界是独占的?

关于切片最常见的实际用法(以及解决该问题的其他方法),即获取列表中每个第N个元素,请参见 Pythonic way to return list of every nth item in a larger list。请在适当的地方将该问题作为重复目标。

有关切片赋值的更具体答案,请参见 How does assignment work with list slices?(尽管这也在这里回答了)。


语法是:

a[start:stop]  # 从 start 到 stop-1 的元素
a[start:]      # 从 start 到数组的其余部分的元素
a[:stop]       # 从开头到 stop-1 的元素
a[:]           # 整个数组的副本

还有 step 值,可以与上述任何一种一起使用:

a[start:stop:step] # 从 start 开始到 not past stop,按 step 进行

要记住的关键点是,:stop 值表示 未被选中 的第一个值。因此,stopstart 之间的差异是所选元素的数量(如果 step 为 1,则为默认值)。

另一个特性是 startstop 可能是一个负数,这意味着它从数组的末尾开始计数而不是从开头开始。因此:

a[-1]    # 数组中的最后一个元素
a[-2:]   # 数组中的最后两个元素
a[:-2]   # 除最后两个元素之外的所有元素

同样,step 也可能是负数:

a[::-1]    # 数组中的所有元素,反向排序
a[1::-1]   # 前两个元素,反向排序
a[:-3:-1]  # 最后两个元素,反向排序
a[-3::-1]  # 除最后两个元素之外的所有元素,反向排序

如果所请求的项目少于项目数量,Python 对程序员很友好。例如,如果您请求 a[:-2] 并且 a 只包含一个元素,您将获得一个空列表而不是错误。有时您会更喜欢错误,因此您必须意识到这种情况可能会发生。

slice 对象的关系

一个 slice 对象可以表示切片操作,即:

a[start:stop:step]

等同于:

a[slice(start, stop, step)]

slice 对象的行为也取决于参数的数量,类似于 range(),即支持 slice(stop)slice(start, stop[, step])
要跳过指定给定参数,可以使用 None,因此例如 a[start:] 等效于 a[slice(start, None)]a[::-1] 等效于 a[slice(None, None, -1)]

虽然基于 : 的符号法对于简单的切片非常有用,但显式使用 slice() 对象简化了程序生成切片。

posted @ 2023-10-15 23:29  小满独家  阅读(55)  评论(0)    收藏  举报