切片作用:用来切割可迭代的对象
语法:object[star:end:step]
start:切片的起始位置
end:切片的结束位置,但是不包含end
step :步长,默认取值为1,为正数的情况表示从左往右,反之从右往左
注:一个完整的切片包括3个参数和两个冒号
切片的几种特殊情况:
object[start:]
obeject[:end]
obeject[start:end]
object[start:end:step]
1.切割单个值(操作与数组类似,索引从0开始)
2.切割完整对象
a[ : ]
a[ :: ]
以上两种均表示取出容器中的所有对象
a[ ::-1 ] :表示容器取反操作
3. start和end全为负(-)索引的情况
>>>a[-1:-6] >>> [] step=1,从左往右取值,而start-1到end=-6从右往左取值,两者矛盾,所以为空
>>>a[-1:-6:-1] >>> [9, 8, 7, 6, 5] step=-1,从右往左取值,start-1到end-6同样是从右往左取值
>>>a[-6:-1] >>> [4, 5, 6, 7, 8] step=1,从左往右取值,而start=-6到end=-1同样是从左往右取值
注:从右往左步长只能为-1
>>>a[:-6:-1] >>> [9, 8, 7, 6, 5] step=-1,从右往左取值,从“终点”开始一直取到end_index=-6。
>>>a[-6::-1] >>> [4, 3, 2, 1, 0] step=-1,从右往左取值,从start_index=-6开始,一直取到“起点”。
4. start_index和end_index正(+)负(-)混合索引的情况
>>>a[1:-6] >>> [1, 2, 3] start_index=1在end_index=-6的左边,因此从左往右取值,而step=1同样决定了从左往右取值,因此结果正确
>>>a[1:-6:-1] >>> [] start_index=1在end_index=-6的左边,因此从左往右取值,但step=-则决定了从右往左取值,两者矛盾,因此为空。
>>>a[-1:6] >>> [] start_index=-1在end_index=6的右边,因此从右往左取值,但step=1则决定了从左往右取值,两者矛盾,因此为空。
>>>a[-1:6:-1] >>> [9, 8, 7] start_index=-1在end_index=6的右边,因此从右往左取值,而step=-1同样决定了从右往左取值,因此结果正确。
5. 连续切片操作
>>>a[:8][2:5][-1:] >>> [4] 相当于: a[:8]=[0, 1, 2, 3, 4, 5, 6, 7] a[:8][2:5]= [2, 3, 4] a[:8][2:5][-1:] = 4 理论上可无限次连续切片操作,只要上一次返回的依然是非空可切片对象。
6. 切片操作的三个参数可以用表达式
>>>a[2+1:3*2:7%3] >>> [3, 4, 5] 即:a[2+1:3*2:7%3] = a[3:6:1]
7. 其他对象的切片操作
前面的切片操作说明都以list为例进行说明,但实际上可进行的切片操作的数据类型还有很多,包括元组、字符串等等。
>>> (0, 1, 2, 3, 4, 5)[:3] >>> (0, 1, 2) 元组的切片操作
>>>'ABCDEFG'[::2] >>>'ACEG' 字符串的切片操作
常用切片操作
以列表:a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 为说明对象
1.取偶数位置
>>>b = a[::2] [0, 2, 4, 6, 8]
2.取奇数位置
>>>b = a[1::2] [1, 3, 5, 7, 9]
总结
(一)start、end、step可同为正、同为负,也可正负混合使用。但必须遵循一个原则,否则无法正确切取到数据:当start的位置在end的左边时,表示从左往右取值,此时step必须是正数(同样表示从左往右);当start的位置在end的右边时,表示从右往左取值,此时step必须是负数(同样表示从右往左),即两者的取值顺序必须是相同的。对于特殊情况,当start或end省略时,起始索引和终止索引由step的正负来决定,不会存在取值方向出现矛盾的情况(即不会返回空列表[]),但正和负取到的结果是完全不同的,因为一个向左一个向右。
(二)在利用切片时,step的正负是必须要考虑的,尤其是当step省略时。比如a[-1:],很容易就误认为是从“终点”开始一直取到“起点”,即a[-1:]= [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],但实际上a[-1:]=a[-1]=9,原因在于step=1表示从左往右取值,而起始索引start=-1本身就是对象的最右边的元素了,再往右已经没数据了,因此只有a[-1]一个元素。