Python中的序列

序列(Sequence)是Python中的一种数据结构,这种数据结构根据索引来获取序列中的对象。
Python3中含有三种内建序列类型:list, tuple, string, range。其中range比较特殊,它是一个生成器,其他几个类型具有的一些序列特性对它并不适合,本篇不做详述。

切片操作

切片操作就是对序列按照给定的索引和步长,截取序列中由连续对象组成的片段。
对于序列结构来说,索引和步长都有正负值,分别表示左右两个方向
索引的正方向从左往右取值,起始位置为0,有效范围为 [0, 序列长度-1]
索引的负方向从右往左取值,起始位置为-1,有效范围为 [-序列长度, -1]
因此任意一个序列结构数据的索引范围为-序列长度序列长度-1范围内的连续整数。

用图来表示如下,对于一个字符串’Python’,它的正负索引如下

1
2
3
字符串    P   y   t   h   o   n
正索引 0 1 2 3 4 5
负索引 -6 -5 -4 -3 -2 -1

理解了序列索引的特点就能很轻松对字符串进行切片。

切片操作语法

1
2
3
4
Sequence [start_index: end_index: step]
start:表示是第一个元素对象,正索引位置默认为0;负索引位置默认为 -序列长度
end:表示是最后一个元素对象,正索引位置默认为 序列长度-1;负索引位置默认为 -1
step:步长,end-start,步长为正时,从左向右取值。步长为负时,反向取值,默认为1,步长值不能为0

*注意:
切片的结果不包含结束索引,即不包含最后的一位,-1代表列表的最后一个位置索引

例子

写得再生动还不如一个例子有用

1
2
3
4
5
6
#生成一组列表
L = list(range(21))
>>> L
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
>>> len(L)
21

索引范围为:-21~20

切片操作 含义 结果
L[0] 取第一个元素 0
L[:] 取一个完整的序列,相当于浅拷贝
L[-1] 取最后一个元素 20
L[1:5] 截取从索引为1,到索引为5前面的元素 [1, 2, 3, 4]
L[-5:] 截取后面5个元素 [16, 17, 18, 19, 20]
L[:10:2] 开始到索引为10的元素(但不包括),每隔5个取一个元素 [0, 5]
L[::5] 所有元素,每5个取一个 [0, 5, 10, 15, 20]
L[1::5] 从索引为1的元素开始到结束,隔5个取一个元素 [1, 6, 11, 16]
L[::-1] 将列表倒序
L[::-4] 倒序列表后按照step的绝对值间隔取元素 [20, 16, 12, 8, 4, 0]
L[::-3] 同上 [20, 17, 14, 11, 8, 5, 2]
L[5:0:-1] step为负数,逆向访问,切片访问到的正值索引范围为[1:5] [5, 4, 3, 2, 1]
L[1:6:-1] step为负数,逆向访问,切片访问到的正值索引范围为[5:1],但其中无元素 []

参考文档

https://docs.python.org/3/library/stdtypes.html