前言
大家好,这里是果力成,话不多说,学之! 在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列表切片
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:切取方向非常重要~
列表(list)切片操作详例
以下示例均以list列表 a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]为例:
a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
1.切取列表单个值
print(a[1])
print(a[-3])
output: 1 ?? ? 7?
2.切取列表完整对象
print(a[:])
print(a[: :])
print(a[: : -1])
output:
3.start_index和end_index都为正(+)索引
print(a[1:6])
output : [1, 2, 3, 4, 5]
print(a[1:5:-1])
没有数据,输出的空列表 output : [ ]
print(a[5:1])
没有数据,输出的空列表 output : [ ]
print(a[:5] )
output : [0, 1, 2, 3, 4]
print(a[:5:-1])
output : [9, 8, 7, 6]
print(a[5:])
print(a[5::-1] )
output : [5, 6, 7, 8, 9] ?? ? ? [5, 4, 3, 2, 1, 0]
4.start_index和end_index全为负(-)索引
print(a[-1:-5])
print(a[-1:-5:-1])
output : [ ] ? ? [9, 8, 7, 6]
print(a[-6:-1])
print(a[:-6])
print(a[:-6:-1])
output : [4, 5, 6, 7, 8] ?? ? ? [0, 1, 2, 3] ?? ? ? [9, 8, 7, 6, 5]
print(a[-6:])
print(a[6::-1])
output : [4, 5, 6, 7, 8, 9] ??? ? [6, 5, 4, 3, 2, 1, 0]
5.start_index和end_index正(+)负(-)混合索引
print(a[1:-6])
print(a[1:-6:-1])
print(a[-1:6])
print(a[-1:6:-1])
output : [1, 2, 3] ? ? ? ? [] ? ? ? ? [] ? ?? ? [9, 8, 7]
6.连续切片操作
再啰嗦一下:切取方向非常重要~
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]切片.理论上可无限次连续切片操作,只要上一次返回的依然是非空可切片对象。
7.三个参数(start_index、end_index、step)表达式计算
print(a[2+1:3*2:7%3])
output : [3, 4, 5]
Python元组切片
元组(tuple)也是一种list,唯一区别是tuple不可变。因此,tuple也可以用切片操作,只是操作的结果仍是tuple:
print((0, 1, 2, 3, 4, 5)[:3])
output : (0, 1, 2)
Python字符串切片
字符串(string) ‘aaa’ 或Unicode字符串 u’aaa’ 也可以看成是一种list,每个元素就是一个字符。因此,字符串也可以用切片操作,只是操作结果仍是字符串:
print('ABCDEFG'[:3])
print('ABCDEFG'[::2])
output : ABC ? ? ? ?ACEG
print('Hello'[1:3])
直接看输出output : el
有了切片操作,很多地方循环就不再需要了。Python的切片非常灵活,一行代码就可以实现很多行循环才能完成的操作。例如:
for i in range(1,100)[2::3][-10:]:
print(i, end=' ')
output : 72 75 78 81 84 87 90 93 96 99
for i in range(1,100)[2::3][:10]:
print(i, end=' ')
output : 3 6 9 12 15 18 21 24 27 30
Python切片操作
以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()都属于“浅拷贝”,只拷贝最外层元素,内层嵌套元素则通过引用,而不是独立分配内存。浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。
取奇偶
print(a[::2])
print(a[1::2])
output : [0, 2, 4, 6, 8] ? ? ? ? [1, 3, 5, 7, 9]
小结
切片操作是Python的基础操作之一,应当熟练掌握,会帮我们提高更多效率.切取方向非常重要~ 了解透彻step,就很容易理解.这篇blog也是博主在前辈的基础上加上自己的理解学习总结的,希望能给到你帮助~
欢迎关注 IT果力成,一起交流学习
|