首先简明概要说明用法,然后再用实际例子阐述。
用法概述
[-1] [:-1] [::-1] [n::-1]都是python中切片的使用方法。
- [-1]:获取最后一个元素,类似于matlab中的end;
- [:-1]:除了最后一个元素,获取其他所有的元素;
- [::-1]:对第一个到最后一个元素进行倒序之后取出;
- [n::-1]:对第一个到第n个元素进行倒序后取出。
一般用法
在Python中,切片(slice)是对序列型对象(如list, string, tuple)的一种高级索引方法。普通索引只取出序列中一个下标对应的元素,而切片取出序列中一个范围对应的元素,这里的范围不是狭义上的连续片段。
基本索引
我们从Python的基本索引开始,即单个整数的索引。假设被索引的序列仍为之前提到的a,则基本索引的语法为a[index],其中index为下标。读者可能会觉得这里过于简单,但我们要强调的是Python一个语法糖:负数下标索引,即:index可以取为负数,当其为-n时,对倒数第n个元素进行索引。我们用一张表格值观展示a的索引范围。
简单的切片
简单切片指的是这样的切片形式:a[start:stop],其行为是得到下标在这样一个前闭后开区间范围内的元素,这个与matlab中的索引不大相同。其中start和stop为负数时,简单看作是负数下标对应的位置即可:
X = [1,2,3,4,5]
X[-3:-1]
[3, 4]
- 1
- 2
- 3
- 切片超出索引范围:当start或stop超出上文提到的有效索引范围时,切片操作不会抛出异常,而是进行截断。
#实质上截断为了X[-3:5]
X[-3:100]
[3, 4, 5]
- 1
- 2
- 3
- 缺省:start和stop都是可以缺省的,在缺省的情况下,Python的行为是
尽可能取最大区间
,具体来说:
#当step为正值,或者默认为1时,start的缺省值是无穷小(),stop的缺省值是无穷大()
#等效于X[0:3],前闭后开
X[:3]
[1, 2, 3]
#当step为负值是,Python的行为是尽可能取最大区间,此时访问是逆序的,start应尽量取大,stop应尽量取小,才能保证区间最大
X[:3:-1]
#等效于X[4:3],前闭后开
[5]
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
扩展切片
扩展切片指的是这样的切片形式:a[start:stop:step],其中step是一个非零整数,即比简单切片多了调整步长的功能,此时切片的行为可概括为:从start对应的位置出发,以step为步长索引序列,直至越过stop对应的位置,且不包括stop本身。事实上,简单切片就是step=1的扩展切片的特殊情况。需要详细解释的是step分别为正数和负数的两种情况。
- step为正数:按照step的间距,从最开始索引到最终值;
X[1:4:2]
[2, 4]
- 1
- 2
- step为负数:
X[-1:1:-2]
[5, 3]
- 1
- 2
实例说明
- [-1]:获取最后一个元素,类似于matlab中的end;
#-1即为负向第一个索引
X[-1]
5
- 1
- 2
- 3
- [:-1]:除了最后一个元素,获取其他所有的元素;
#由于step为缺省,默认为1,那么start缺省时取最小值0,即等效于X[0:-1]
X[:-1]
[1, 2, 3, 4]
- 1
- 2
- 3
- [::-1]:对第一个到最后一个元素进行倒序之后取出;
#由于step为-1是逆序,那么start缺省时取最大值4,stop缺省时取最小值-6,即等效于X[4:-6:-1]
X[::-1]
[5, 4, 3, 2, 1]
- 1
- 2
- 3
- [n::-1]:对第一个到第n个元素进行倒序后取出。
#由于step为-1是逆序,其中start为n,stop缺省时取最小值0,即等效于X[n:-(len+1):-1],即从第n个元素开始取出到第1个元素。
X[3::-1]
[4, 3, 2, 1]
#等效于X[3:-6:-1]
- 1
- 2
- 3
- 4
部分内容参考:https://zhuanlan.zhihu.com/p/79541418