zoukankan      html  css  js  c++  java
  • python疑难问题---13、Python切片操作

    python疑难问题---13、Python切片操作

    一、总结

    一句话总结:

    Python切片操作的核心就是:切片操作的时候先分析step,因为step正负表示方向,再看start_index和end_index,step为正表示从左到右切片,为负表示从右往左(如果此时起点参数省略,那么起点应该是最右端)

    1、python切片操作注意?

    1、切片中索引是有正负的
    2、切片操作的时候先分析step,因为step正负表示方向,再看start_index和end_index,step为正表示从左到右切片,为负表示从右往左(如果此时起点参数省略,那么起点应该是最右端)
    3、切片操作除了列表,还有元组、字符串等
    4、可以用切片操作来替换值或者插入值

    二、Python切片操作

    博客对应课程的视频位置:13、Python切片操作-范仁义-读书编程笔记
    https://www.fanrenyi.com/video/32/377

    在利用Python解决各种实际问题的过程中,经常会遇到从某个对象中抽取部分值的情况,切片操作正是专门用于完成这一操作的有力武器。理论上而言,只要条件表达式得当,可以通过单次或多次切片操作实现任意切取目标值。切片操作的基本语法比较简单,但如果不彻底搞清楚内在逻辑,也极容易产生错误,而且这种错误有时隐蔽得比较深,难以察觉。

    一、Python可切片对象的索引方式

    Python可切片对象的索引方式包括:正索引和负索引两部分。

    如下图所示,以a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]为例:

    二、Python切片操作的一般方式

    一个完整的切片表达式包含两个“:”,用于分隔三个参数(start_index、end_index、step),当只有一个“:”时,默认第三个参数step=1。

    切片操作基本表达式:object[start_index : end_index : step]
    
    
    • step:正负数均可,其绝对值大小决定了切取数据时的“步长”,而正负号决定了“切取方向”,正表示“从左往右”取值,负表示“从右往左”取值。当step省略时,默认为1,即从左往右以增量1取值。“切取方向非常重要!”“切取方向非常重要!”“切取方向非常重要!”,重要的事情说三遍!

    • start_index:表示起始索引(包含该索引本身);该参数省略时,表示从对象“端点”开始取值,至于是从“起点”还是从“终点”开始,则由step参数的正负决定,step为正从“起点”开始,为负从“终点”开始。

    • end_index:表示终止索引(不包含该索引本身);该参数省略时,表示一直取到数据”端点“,至于是到”起点“还是到”终点“,同样由step参数的正负决定,step为正时直到”终点“,为负时直到”起点“。

    三、Python切片操作详细例子

    In [1]:
    a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    

    1.切取单个值

    In [2]:
    a[0]
    
    Out[2]:
    0
    In [3]:
    a[3]
    
    Out[3]:
    3
    In [4]:
    a[-4]
    
    Out[4]:
    6
    In [5]:
    a[-7]
    
    Out[5]:
    3

    2.切取完整对象

    切片操作的时候先分析step,因为step正负表示方向,再看start_index和end_index

    In [6]:
    print(a[:]) # 从左往右
    print(a[::]) # 从左往右
    
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    
    In [7]:
    print(a[::-1]) # 从右往左
    
    [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
    

    3.start_index和end_index全为正(+)索引的情况

    In [8]:
    # step=1,从左往右取值,start_index=1到end_index=6同样表示从左往右取值。
    a[1:6] 
    
    Out[8]:
    [1, 2, 3, 4, 5]
    In [9]:
    # step=-1,决定了从右往左取值,而start_index=1到end_index=6决定了从左往右取值,两者矛盾。
    a[1:6:-1] 
    
    Out[9]:
    []
    In [10]:
    # step=1,决定了从左往右取值,而start_index=6到end_index=1决定了从右往左取值,两者矛盾。
    a[6:1] 
    
    Out[10]:
    []
    In [11]:
    # step=1,从左往右取值,从“起点”开始一直取到end_index=6。
    a[:6] 
    
    Out[11]:
    [0, 1, 2, 3, 4, 5]
    In [12]:
    # step=-1,从右往左取值,从“终点”开始一直取到end_index=6。
    a[:6:-1] 
    
    Out[12]:
    [9, 8, 7]
    In [13]:
    # step=,从左往右取值,从start_index=6开始,一直取到“终点”。
    a[6:] 
    
    Out[13]:
    [6, 7, 8, 9]
    In [14]:
    # step=-1,从右往左取值,从start_index=6开始,一直取到“起点”。
    a[6::-1] 
    
    Out[14]:
    [6, 5, 4, 3, 2, 1, 0]

    4.start_index和end_index全为负(-)索引的情况

    In [15]:
    # step=1,从左往右取值,而start_index=-1到end_index=-6决定了从右往左取值,两者矛盾。
    a[-1:-6]
    
    Out[15]:
    []
    In [16]:
    # step=-1,从右往左取值,start_index=-1到end_index=-6同样是从右往左取值。
    a[-1:-6:-1]
    
    Out[16]:
    [9, 8, 7, 6, 5]
    In [17]:
    # step=1,从左往右取值,而start_index=-6到end_index=-1同样是从左往右取值。
    a[-6:-1]
    
    Out[17]:
    [4, 5, 6, 7, 8]
    In [18]:
    # step=1,从左往右取值,从“起点”开始一直取到end_index=-6。
    a[:-6] 
    
    Out[18]:
    [0, 1, 2, 3]
    In [19]:
    # step=-1,从右往左取值,从“终点”开始一直取到end_index=-6。
    a[:-6:-1] 
    
    Out[19]:
    [9, 8, 7, 6, 5]
    In [20]:
    # step=1,从左往右取值,从start_index=-6开始,一直取到“终点”。
    a[-6:] 
    
    Out[20]:
    [4, 5, 6, 7, 8, 9]
    In [21]:
    # step=-1,从右往左取值,从start_index=-6开始,一直取到“起点”。
    a[-6::-1] 
    
    Out[21]:
    [4, 3, 2, 1, 0]

    5.start_index和end_index正(+)负(-)混合索引的情况

    In [22]:
    # start_index=1在end_index=-6的左边,因此从左往右取值,而step=1同样决定了从左往右取值。
    a[1:-6]
    
    Out[22]:
    [1, 2, 3]
    In [23]:
    # start_index=1在end_index=-6的左边,因此从左往右取值,但step=-则决定了从右往左取值,两者矛盾。
    a[1:-6:-1] 
    
    Out[23]:
    []
    In [24]:
    a[-6:1:-1] 
    
    Out[24]:
    [4, 3, 2]
    In [25]:
    # start_index=-1在end_index=6的右边,因此从右往左取值,但step=1则决定了从左往右取值,两者矛盾。
    a[-1:6]
    
    Out[25]:
    []
    In [26]:
    # start_index=-1在end_index=6的右边,因此从右往左取值,而step=-1同样决定了从右往左取值。
    a[-1:6:-1] 
    
    Out[26]:
    [9, 8, 7]

    6.连续切片操作

    In [27]:
    a[:8][2:5][-1:]
    
    Out[27]:
    [4]

    相当于:

    a[:8]=[0, 1, 2, 3, 4, 5, 6, 7]
    a[:8][2:5]= [2, 3, 4]
    a[:8][2:5][-1:] = 4
    

    理论上可无限次连续切片操作,只要上一次返回的依然是非空可切片对象。

    7.切片操作的三个参数可以用表达式

    In [28]:
    # 即:a[2+1:3*2:7%3] = a[3:6:1]
    a[2+1:3*2:7%3]
    
    Out[28]:
    [3, 4, 5]

    四、Python常用切片操作

    1.取偶数位置

    In [29]:
    a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    a[::2]
    
    Out[29]:
    [0, 2, 4, 6, 8]

    2.取奇数位置

    In [30]:
    a[1::2]
    
    Out[30]:
    [1, 3, 5, 7, 9]

    3.拷贝整个对象

    In [31]:
    b = a[:]
    print(b)
    b = a.copy()
    print(b)
    
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    

    需要注意的是:[:]和.copy()都属于“浅拷贝”,只拷贝最外层元素,内层嵌套元素则通过引用,而不是独立分配内存。

    4.修改单个元素

    In [32]:
    a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    a[3] = ['A','B']
    a
    
    Out[32]:
    [0, 1, 2, ['A', 'B'], 4, 5, 6, 7, 8, 9]

    5.在某个位置插入元素

    In [33]:
    a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    print(a[3:3])
    
    []
    
    In [34]:
    a[3:3] = ['a','b','c']
    print(a)
    
    [0, 1, 2, 'a', 'b', 'c', 3, 4, 5, 6, 7, 8, 9]
    
    In [35]:
    a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    a[0:0] = ['C','D']
    a
    
    Out[35]:
    ['C', 'D', 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

    6.替换一部分元素

    In [36]:
    a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    a[3:8] = ['E','F']
    a
    
    Out[36]:
    [0, 1, 2, 'E', 'F', 8, 9]

    五、其他对象的切片操作

    前面的切片操作说明都以list为例进行说明,但实际上可进行的切片操作的数据类型还有很多,包括元组、字符串等等。

    In [37]:
     (0, 1, 2, 3, 4, 5)[:3] # 元组的切片操作
    
    Out[37]:
    (0, 1, 2)
    In [38]:
    'ABCDEFG'[::2] # 字符串的切片操作
    
    Out[38]:
    'ACEG'
    In [39]:
    # 利用range函数生成1-99的整数,然后取3的倍数,再取最后十个。
    for i in range(1,100)[2::3][-10:]: 
        print(i, end=' ')
    
    72 75 78 81 84 87 90 93 96 99 

    六、总结

    python的切片操作非常简单,注意以下几点就好了:

    1、切片中索引是有正负的
    2、切片操作的时候先分析step,因为step正负表示方向,再看start_index和end_index,step为正表示从左到右切片,为负表示从右往左(如果此时起点参数省略,那么起点应该是最右端)
    3、切片操作除了列表,还有元组、字符串等
    4、可以用切片操作来替换值或者插入值
    In [ ]:
     
     
    系列博客对应课程视频地址:
    1、遍历列表的三种方式-范仁义-读书编程笔记
    https://www.fanrenyi.com/video/32/293
    2、字典排序-范仁义-读书编程笔记
    https://www.fanrenyi.com/video/32/294
    3、可变和不可变数据类型-范仁义-读书编程笔记
    https://www.fanrenyi.com/video/32/295
    4、python文件处理-范仁义-读书编程笔记
    https://www.fanrenyi.com/video/32/305
    5、二维列表初始化-范仁义-读书编程笔记
    https://www.fanrenyi.com/video/32/306
    6、python中浅拷贝和深度拷贝-范仁义-读书编程笔记
    https://www.fanrenyi.com/video/32/307
    7、python中的with...as...-范仁义-读书编程笔记
    https://www.fanrenyi.com/video/32/320
    8、只有一个数的元组表示-范仁义-读书编程笔记
    https://www.fanrenyi.com/video/32/343
    9、Python类中call函数的作用-范仁义-读书编程笔记
    https://www.fanrenyi.com/video/32/361
    10、python遍历字典的几种方式-范仁义-读书编程笔记
    https://www.fanrenyi.com/video/32/368
    11、python内嵌for...in循环-范仁义-读书编程笔记
    https://www.fanrenyi.com/video/32/369
    12、python生成器-范仁义-读书编程笔记
    https://www.fanrenyi.com/video/32/370
    13、Python切片操作-范仁义-读书编程笔记
    https://www.fanrenyi.com/video/32/377
     
     
     
    我的旨在学过的东西不再忘记(主要使用艾宾浩斯遗忘曲线算法及其它智能学习复习算法)的偏公益性质的完全免费的编程视频学习网站: fanrenyi.com;有各种前端、后端、算法、大数据、人工智能等课程。
    博主25岁,前端后端算法大数据人工智能都有兴趣。
    大家有啥都可以加博主联系方式(qq404006308,微信fan404006308)互相交流。工作、生活、心境,可以互相启迪。
    聊技术,交朋友,修心境,qq404006308,微信fan404006308
    26岁,真心找女朋友,非诚勿扰,微信fan404006308,qq404006308
    人工智能群:939687837

    作者相关推荐

  • 相关阅读:
    hdu 1251(字典树)
    hdu 1556(树状数组)
    hdu 3275(线段树的延迟标记,我被坑了)
    TCL之容器
    Codeforces Round #587 (Div. 3) D. Swords
    struts2中多个文件同时上传
    ffmpeg的使用
    struts2中类型转换器
    struts中访问servlet API的方法
    struts2中多个逻辑action(方法)的动态调用
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/13880821.html
Copyright © 2011-2022 走看看