大家好,这里是果力成,话不多说,学之!
在python学习开发的过程中,我们难免会遇到从某个对象中抽取部分值的情况,对这种经常取指定索引的范围的操作,如果你使用循环的话是可以解决的,但是相对更好的方法而言,此操作是相当繁琐和费事的。
python中的 切片操作
正是专门用于完成这一操作的便捷有力方法.
Python可切片对象的索引方式包括:正索引和负索引。
如下图所示,以a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]为例:
------>从左向右 从右向左<------
正索引 | 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ,9 |
---|---|
负索引 | -10, -9,-8,-7,-6,-5,-4,-3,-2,-1 |
值 | (起点)0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ,9(终点) |
Python中符合序列的有序序列都支持切片(slice),例如列表,字符串,元组。
切片操作基本表达式:
object[start_index : end_index : step]
切片表达式包含两个":" ,用于分隔三个参数(start_index、end_index、step),当只有一个":"时,默认第三个参数step=1。
start_index:表示起始索引(包含该索引本身);该参数省略时,表示从对象’端点’开始取值,至于是从“起点”还是从“终点”开始,则由step参数的正负决定,step为正从“起点”开始,为负从“终点”开始。
end_index:表示终止索引(不包含该索引本身);该参数省略时,表示一直取到数据’端点’,至于是到’起点’还是到’终点’,同样由step参数的正负决定,step为正时直到’终点’,为负时直到’起点’。
step:(步长) , 正负数均可,其绝对值大小决定了切取数据时的“步长”,而正负号决定了“切取方向”,step为正表示“从左往右”取值,step为负表示“从右往左”取值。当step省略时,默认为1,即从左往右以增量1取值。
tips:切取方向非常重要~
注意看代码语句后的注释理解 |
a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(a[1])
print(a[-3])
output: 1
7
print(a[:]) # 从左往右
print(a[: :]) # 从左往右
print(a[: : -1]) # 从右往左
print(a[1:6])
# step=1,从左往右取值,start_index=1到end_index=6同样表示从左往右取值。
output : [1, 2, 3, 4, 5]
print(a[1:5:-1])
# step=-1,决定了从右往左取值,而start_index=1到end_index=5决定了从左往右取值,互相矛盾。
没有数据,输出的空列表
output : [ ]
print(a[5:1])
# step=1,决定了从左往右取值,而start_index=5到end_index=1决定了从右往左取值,互相矛盾。
没有数据,输出的空列表
output : [ ]
print(a[:5] )
# step=1,从左往右取值,从“起点”开始一直取到end_index=5。
output : [0, 1, 2, 3, 4]
print(a[:5:-1])
# step=-1,从右往左取值,从“终点”开始一直取到end_index=5。
output : [9, 8, 7, 6]
print(a[5:])
# step=1,从左往右取值,从start_index=5开始,一直取到“终点”。
print(a[5::-1] )
# step=-1,从右往左取值,从start_index=5开始,一直取到“起点”。
output : [5, 6, 7, 8, 9]
[5, 4, 3, 2, 1, 0]
print(a[-1:-5])
# step=1,从左往右取值,而start_index=-1到end_index=-5决定了从右往左取值,两者矛盾。
print(a[-1:-5:-1])
# step=-1,从右往左取值,start_index=-1到end_index=-5同样是从右往左取值。
output : [ ]
[9, 8, 7, 6]
print(a[-6:-1])
# step=1,从左往右取值,而start_index=-6到end_index=-1同样是从左往右取值。
print(a[:-6])
# step=1,从左往右取值,从“起点”开始一直取到end_index=-6。
print(a[:-6:-1])
# step=-1,从右往左取值,从“终点”开始一直取到end_index=-6。
output : [4, 5, 6, 7, 8]
[0, 1, 2, 3]
[9, 8, 7, 6, 5]
print(a[-6:])
# step=1,从左往右取值,从start_index=-6开始,一直取到“终点”。
print(a[6::-1])
# step=-1,从右往左取值,从start_index=6开始,一直取到“起点”。
output : [4, 5, 6, 7, 8, 9]
[6, 5, 4, 3, 2, 1, 0]
print(a[1:-6])
# start_index=1在end_index=-6的左边,因此从左往右取值,而step=1同样决定了从左往右取值。
print(a[1:-6:-1])
# start_index=1在end_index=-6的左边,因此从左往右取值,但step=-则决定了从右往左取值,两者矛盾
print(a[-1:6])
# start_index=-1在end_index=6的右边,因此从右往左取值,但step=1则决定了从左往右取值,两者矛盾。
print(a[-1:6:-1])
# start_index=-1在end_index=6的右边,因此从右往左取值,而step=-1同样决定了从右往左取值。
output : [1, 2, 3]
[]
[]
[9, 8, 7]
再啰嗦一下:切取方向非常重要~
print(a[:8][2:5][-1:])
output : [4]
分步解:
a[:8]=[0, 1, 2, 3, 4, 5, 6, 7]
a[:8][2:5]= [2, 3, 4]
a[:8][2:5][-1:] = 4
解出a[:8],然后在a[:8]的基础上进行[2:5]切片,再对a[:8][2:5]进行[-1]切片.理论上可无限次连续切片操作,只要上一次返回的依然是非空可切片对象。
print(a[2+1:3*2:7%3])
# a[2+1:3*2:7%3] = a[3:6:1]
output : [3, 4, 5]
元组(tuple)也是一种list,唯一区别是tuple不可变。因此,tuple也可以用切片操作,只是操作的结果仍是tuple:
print((0, 1, 2, 3, 4, 5)[:3])
output : (0, 1, 2)
字符串(string) ‘aaa’ 或Unicode字符串 u’aaa’ 也可以看成是一种list,每个元素就是一个字符。因此,字符串也可以用切片操作,只是操作结果仍是字符串:
print('ABCDEFG'[:3])
print('ABCDEFG'[::2]) #步长step为2
output : ABC
ACEG
#字符串分割
print('Hello'[1:3])
直接看输出output : el
有了切片操作,很多地方循环就不再需要了。Python的切片非常灵活,一行代码就可以实现很多行循环才能完成的操作。例如:
for i in range(1,100)[2::3][-10:]:
print(i, end=' ')
#利用range函数生成1-99的整数,然后取3的倍数,再取最后十个。
output : 72 75 78 81 84 87 90 93 96 99
for i in range(1,100)[2::3][:10]:
print(i, end=' ')
#同样是取3的倍数,不过是取前十个。
output : 3 6 9 12 15 18 21 24 27 30
以a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]为例: |
a[3:3] = ['A','B','C']
print(a)
output : [0, 1, 2, ‘A’, ‘B’, ‘C’, 3, 4, 5, 6, 7, 8, 9]
a[3] = ['A','B']
print(a)
output : [0, 1, 2, [‘A’, ‘B’], 4, 5, 6, 7, 8, 9]
a[3:6] = ['A','B']
print(a)
output : [0, 1, 2, ‘A’, ‘B’, 6, 7, 8, 9]
print(a[:])
#将上面替换后的输出复制
output : [0, 1, 2, ‘A’, ‘B’, 6, 7, 8, 9]
注意:
[:]和.copy()都属于“浅拷贝”,只拷贝最外层元素,内层嵌套元素则通过引用,而不是独立分配内存。浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。
# 1.取偶数位置
print(a[::2])
# 2.取奇数位置
print(a[1::2])
output : [0, 2, 4, 6, 8]
[1, 3, 5, 7, 9]
切片操作是Python的基础操作之一,应当熟练掌握,会帮我们提高更多效率.切取方向非常重要~
了解透彻step,就很容易理解.这篇blog也是博主在前辈的基础上加上自己的理解学习总结的,希望能给到你帮助~