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
值表示 未被选中 的第一个值。因此,stop
和 start
之间的差异是所选元素的数量(如果 step
为 1,则为默认值)。
另一个特性是 start
或 stop
可能是一个负数,这意味着它从数组的末尾开始计数而不是从开头开始。因此:
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()
对象简化了程序生成切片。