类别: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网别的相干文章!

打赏

感谢您的赞助~

打开支付宝扫一扫,即可进行扫码打赏哦~

版权声明 : 本文未使用任何知识共享协议授权,您可以任何形式自由转载或使用。

 可能感兴趣的文章

评论区

发表评论 / 取消回复

必填

选填

选填

◎欢迎讨论,请在这里发表您的看法及观点。