Python 切片操作

程序浅谈 前端 测试技术 2022-11-30

1. 前言

在刚学python时候,我们都知道字符串(String)、列表(list)和元组(tuple)序列化数据类型支持切片操作。

# slice operation TUPLE = (1,2,3,4) LIST = [1,2,3,4] STRING = "1234" print("TUPLE[1:3]:",TUPLE[1:3]) print("LIST[1:3]:",LIST[1:3]) print("STRING[1:3]:",STRING[1:3]) # output TUPLE[1:3]: (2, 3) LIST[1:3]: [2, 3] STRING[1:3]: 23 复制代码

通过上述例子,我们可以快速使用“区间”的方式截取到想要的数据。那么最后一位始终都没有取到?接下来,我们对熟悉的切片操作进行系统学习。

2. 什么是切片?

2.1 切片概述

Python 序列数据类型索引从左到右开始是从0开始,依次加+1;诺从右到左索引从-1开始,依次加-1。

在Python 中访问子序列/字符串,使用方括号[]来截取指定的子序列/字符串。例如在列表中要元素2和3,则切片截取为LIST[1:3]

2.2 忽略最后一位元素

在Python中,进行切片操作会不包含最后一位元素,这一风格是与C语言等语言保存以索引位置从0开始的做法。

切片忽略最后一位元素会有以下好处:

  • 当切片操作只给出最后一位时,可以直接明了看到截取的子序列的长度。例如LIST[:2]中包含两个元素

  • 根据 Edsger W. Dijkstar 解释,索引位置从0开始比从1开始优势,元素的序数(下标)等于序列中它之前的元素数。切片长度计算方式可以直接(stop-start)计算出

  • 同时,指定任何一个索引位置x,可以对序列切割成不重叠的两个子序列LIST[:x]和LIST[x:]。

 >>> LIST = [1,2,3,4]  >>> LIST[:2] # 直接可以知道截取子序列为2 [1, 2] >>> LIST[2:] # 将LIST在索引位置2处切片 [3, 4] >>>  复制代码

3. 切片原理

切片操作是使用方括号 [] 进行运算的。其格式为 [start:stop:step]。对象在start和stop区间中取出间隔step的元素。step可以取负数。

>>> LIST[1:4:2]  [2, 4] >>> LIST[-1:-4:-1]  [4, 3, 2] >>> LIST[::-1]  [4, 3, 2, 1] >>> LIST[::-2]  [4, 2] >>> 复制代码

start:stop:step 形式在方括号[]内,使用索引下标计算后,返回一个切片对象:slice(start,stop,step)

当序列进行seq[start:stop:step]分片计算时,Python会调用seq.getitem(slice(start,stop,step))方法以元组的形式接收[]方括号索引。

查看Python内置 slice() 方法属性,有三个start、stop和step数据属性和indices方法

>>> slice   <class 'slice'> >>> dir(slice)  ['__class__', '__delattr__', '__dir__', '__doc__', '__eq__',  '__format__', '__ge__', '__getattribute__', '__gt__',  '__hash__', '__init__', '__init_subclass__', '__le__',   '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__',   '__repr__', '__setattr__', '__sizeof__', '__str__',  '__subclasshook__', 'indices', 'start', 'step', 'stop'] >>> 复制代码

根据当序列调用slice方法后,会先执行Seq.indices(len)方法计算出序列Seq从开始start和结束stop位置,步数step。当超出边界时,会截掉。

>>> slice(None,5,1).indices(2) #1 (0, 2, 1) >>> slice(-3,None,None).indices(2) #2 (0, 2, 1) >>> 复制代码

#1 seq[:5:1] 等于 seq[0:2:1]

#2 seq[-3:] 等于 seq[0:2:1]

切片其实还可以支持使用逗号分开多个索引,例如第三库Numpy库就是使用这个特性。

4. 切片赋值

将序列进行切片操作后得到切片对象可以进行赋值,但是必须遵循以下条件:

  • 切片做为对象,那么等号右边必须是一个可迭代的对象

  • 即使切片里只有一个值,也要转换成可迭代的序列

  • 否则的话,系统会抛出TypeError

>>> LIST = [1,2,3,4,5] >>> LIST[1:4] = 23 Traceback (most recent call last):   File "<stdin>", line 1, in <module> TypeError: can only assign an iterable >>> 复制代码

5. 切片计算

在Python中,切片对象可以进行 “+”或“*”运算,以达到拼接组合成新的切片对象。

  • 通过 "+" 连接的是两个同类型序列,两个序列拼接后序列不会发生改变,Python内部会重新创建新的序列

>>> LIST = [1,2,3,4] >>> LIST2 = [5,6,7] >>> LIST + LIST2 [1, 2, 3, 4, 5, 6, 7] >>> s1 = "Jue"     >>> s2 = "Jin"  >>> s1 + s2 'JueJin' 复制代码

  • 通过“Seq*n”,可以将原数据类型复制n份,然后再拼接起来组合新的序列

>>> LIST = [1,2,3,4] >>> LIST * 3 [1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4] >>> s1 = "Jue"        >>> s1 * 3 'JueJueJue'



Apipost 私有化火热进行中

评论