类别:Python / 日期:2019-12-02 / 浏览:78 / 评论:0

在应用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切片操纵细致例子
以下示例均以列表a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]为例:
>>> a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
1.切取单个值
>>> a[0] 0 >>> a[-4] 6
2.切取完整对象
>>> a[:] # 从左往右 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> a[::] # 从左往右 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> a[::-1] # 从右往左 [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
3.start_index和end_index全为正(+)索引的状况
>>> a[1:6] # step=1,从左往右取值,start_index=1到end_index=6一样示意从左往右取值。 [1, 2, 3, 4, 5] >>>a[1:6:-1] # step=-1,决议了从右往左取值,而start_index=1到end_index=6决议了从左往右取值,二者抵牾。 >>> [] # 输出为空列表,申明没取到数据。 >>>a[6:1] # step=1,决议了从左往右取值,而start_index=6到end_index=1决议了从右往左取值,二者抵牾。 >>> [] # 一样输出为空列表。 >>>a[:6] # step=1,从左往右取值,从“出发点”最先一向取到end_index=6。 >>> [0, 1, 2, 3, 4, 5] >>>a[:6:-1] # step=-1,从右往左取值,从“尽头”最先一向取到end_index=6。 >>> [9, 8, 7] >>>a[6:] # step=1,从左往右取值,从start_index=6最先,一向取到“尽头”。 >>> [6, 7, 8, 9] >>>a[6::-1] # step=-1,从右往左取值,从start_index=6最先,一向取到“出发点”。 >>> [6, 5, 4, 3, 2, 1, 0]
相干引荐:《Python视频教程》
4.start_index和end_index全为负(-)索引的状况
>>>a[-1:-6] # step=1,从左往右取值,而start_index=-1到end_index=-6决议了从右往左取值,二者抵牾。 >>> [] >>>a[-1:-6:-1] # step=-1,从右往左取值,start_index=-1到end_index=-6一样是从右往左取值。 >>> [9, 8, 7, 6, 5] >>>a[-6:-1] # step=1,从左往右取值,而start_index=-6到end_index=-1一样是从左往右取值。 >>> [4, 5, 6, 7, 8] >>>a[:-6] # step=1,从左往右取值,从“出发点”最先一向取到end_index=-6。 >>> [0, 1, 2, 3] >>>a[:-6:-1] # step=-1,从右往左取值,从“尽头”最先一向取到end_index=-6。 >>> [9, 8, 7, 6, 5] >>>a[-6:] # step=1,从左往右取值,从start_index=-6最先,一向取到“尽头”。 >>> [4, 5, 6, 7, 8, 9] >>>a[-6::-1] # step=-1,从右往左取值,从start_index=-6最先,一向取到“出发点”。 >>> [4, 3, 2, 1, 0]
5.start_index和end_index正(+)负(-)夹杂索引的状况
>>>a[1:-6] # start_index=1在end_index=-6的左侧,因而从左往右取值,而step=1一样决议了从左往右取值。 >>> [1, 2, 3] >>>a[1:-6:-1] # start_index=1在end_index=-6的左侧,因而从左往右取值,但step=-则决议了从右往左取值,二者抵牾。 >>> [] >>>a[-1:6] # start_index=-1在end_index=6的右侧,因而从右往左取值,但step=1则决议了从左往右取值,二者抵牾。 >>> [] >>>a[-1:6:-1] # start_index=-1在end_index=6的右侧,因而从右往左取值,而step=-1一样决议了从右往左取值。 >>> [9, 8, 7]
6.一连切片操纵
>>>a[:8][2:5][-1:] >>> [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.切片操纵的三个参数能够用表达式
>>>a[2+1:3*2:7%3] # 即:a[2+1:3*2:7%3] = a[3:6:1] >>> [3, 4, 5]
8.其他对象的切片操纵
前面的切片操纵申明都以list为例举行申明,但实际上可举行的切片操纵的数据类型另有许多,包括元组、字符串等等。
>>> (0, 1, 2, 3, 4, 5)[:3] # 元组的切片操纵 >>> (0, 1, 2) >>>'ABCDEFG'[::2] # 字符串的切片操纵 >>>'ACEG' >>>for i in range(1,100)[2::3][-10:]: # 应用range函数生成1-99的整数,然后取3的倍数,再取末了十个。 print(i, end=' ') >>> 72 75 78 81 84 87 90 93 96 99
四、Python经常运用切片操纵
以列表:a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]为申明对象
1.取偶数位置
>>>b = a[::2] [0, 2, 4, 6, 8]
2.取奇数位置
>>>b = a[1::2] [1, 3, 5, 7, 9]
3.拷贝全部对象
>>>b = a[:] # ★★★★★ >>>print(b) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>>print(id(a)) # 41946376 >>>print(id(b)) # 41921864 >>>b = a.copy() >>>print(b) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>>print(id(a)) # 39783752 >>>print(id(b)) # 39759176 需要注重的是:[:]和.copy()都属于“浅拷贝”,只拷贝最外层元素,内层嵌套元素则经由过程援用,而不是自力分派内存。 >>>a = [1,2,['A','B']] >>>print('a={}'.format(a)) a=[1, 2, ['A', 'B']] # 原始a >>>b = a[:] >>>b[0] = 9 # 修正b的最外层元素,将1变成9 >>>b[2][0] = 'D' # 修正b的内嵌层元素 >>>print('a={}'.format(a)) # b修正内部元素A为D后,a中的A也变成了D,申明同享内部嵌套元素,但外部元素1没变。 a=[1, 2, ['D', 'B']] >>>print('b={}'.format(b)) # 修正后的b b=[9, 2, ['D', 'B']] >>>print('id(a)={}'.format(id(a))) id(a)=38669128 >>>print('id(b)={}'.format(id(b))) id(b)=38669192
4.修正单个元素
>>>a[3] = ['A','B'] [0, 1, 2, ['A', 'B'], 4, 5, 6, 7, 8, 9]
5.在某个位置插进去元素
>>>a[3:3] = ['A','B','C'] [0, 1, 2, 'A', 'B', 'C', 3, 4, 5, 6, 7, 8, 9] >>>a[0:0] = ['A','B'] ['A', 'B', 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
6.替代一部分元素
>>>a[3:6] = ['A','B'] [0, 1, 2, 'A', 'B', 6, 7, 8, 9]
五、总结
(一)start_index、end_index、step可同为正、同为负,也可正负夹杂运用。但必需遵照一个准绳,即二者的取值递次必需是雷同的,不然没法准确切取到数据:当start_index的位置在end_index的左侧时,示意从左往右取值,此时step必需是正数(一样示意从左往右);当start_index的位置在end_index的右侧时,示意从右往左取值,此时step必需是负数(一样示意从右往左)。关于特殊状况,当start_index或end_index省略时,肇端索引和停止索引由step的正负来决议,不会存在取值方向涌现抵牾的状况,但正和负取到的结果是完整差别的,由于一个向左一个向右。
(二)在应用切片时,step的正负是必需要斟酌的,尤其是当step省略时。比方a[-1:],很轻易就误以为是从“尽头”最先一向取到“出发点”,即a[-1:]= [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],但实际上a[-1:]=a[-1]=9,缘由在于step=1示意从左往右取值,而肇端索引start_index=-1自身就是对象的最右侧的元素了,再往右已没数据了,因而只要a[-1]一个元素。
以上就是一文完整搞懂python切片操纵的细致内容,更多请关注ki4网别的相干文章!
发表评论 / 取消回复