Python中的切片(Slice)操作详解

Posted 果力成°

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python中的切片(Slice)操作详解相关的知识,希望对你有一定的参考价值。

目录

前言

大家好,这里是果力成,话不多说,学之!
在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])	
# 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]


4.start_index和end_index全为负(-)索引
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]


5.start_index和end_index正(+)负(-)混合索引
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]


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]) 
# a[2+1:3*2:7%3] = a[3:6:1]

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])	#步长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


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()都属于“浅拷贝”,只拷贝最外层元素,内层嵌套元素则通过引用,而不是独立分配内存。浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。


取奇偶
# 1.取偶数位置
print(a[::2])
# 2.取奇数位置
print(a[1::2])

output : [0, 2, 4, 6, 8]
        [1, 3, 5, 7, 9]


小结

切片操作是Python的基础操作之一,应当熟练掌握,会帮我们提高更多效率.切取方向非常重要~
了解透彻step,就很容易理解.这篇blog也是博主在前辈的基础上加上自己的理解学习总结的,希望能给到你帮助~

欢迎关注 IT果力成,一起交流学习

以上是关于Python中的切片(Slice)操作详解的主要内容,如果未能解决你的问题,请参考以下文章

python切片详解

python slice 分片(切片)

python 第27课 列表_切片slice()操作

python 第27课 列表_切片slice()操作

python 第15课 字符串 _切片 slice操作 逆序

python 第15课 字符串 _切片 slice操作 逆序