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

目录

  • 前言
  • 切片的索引方式
  • Python列表切片
  • 列表(list)切片操作详例
  • 1.切取列表单个值
  • 2.切取列表完整对象
  • 3.start_index和end_index都为正(+)索引
  • 4.start_index和end_index全为负(-)索引
  • 5.start_index和end_index正(+)负(-)混合索引
  • 6.连续切片操作
  • 7.三个参数(start_index、end_index、step)表达式计算
  • Python元组切片
  • Python字符串切片
  • Python切片操作
  • 插入
  • 修改
  • 替换
  • 复制
  • 取奇偶
  • 小结
  • 前言

    大家好,这里是果力成,话不多说,学之!
    在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果力成,一起交流学习

    来源:果力成°

    物联沃分享整理
    物联沃-IOTWORD物联网 » Python中的切片(Slice)操作详解

    发表评论