Python slice(切片)

news2024/9/23 13:25:10

在Python中,切片(slice)是对序列型对象(如liststringtuple)的一种高级索引方法。普通索引只取出序列中一个下标对应的元素,而切片取出序列中一个范围对应的元素,这里的范围不是狭义上的连续片段。

切片的基本语法为:

object[start_index : end_index : step]

如果没有缺省的话,表达式应该包含三个参数以及两个冒号,三个参数的意义分别如下:

1、start_index:切片的起始位置(包括该位置),0表示从第一个开始,1表示从第二个开始,以此类推。-1表示从倒数第一个开始,-2表示从倒数第二个开始,以此类推。缺省时取0或-1(即step为正数取0,负数取-1)

a=[9,2,8,7,4,5,1,5,6,8] 
a[0::]表示从第一个到最后一个,结果为   #[9,2,8,7,4,5,1,5,6,8]
a[1::]表示从第二个到最后一个          #[2,8,7,4,5,1,5,6,8]
a[-1::]表示从最后一个到最后一个,一共取一个值  #[8]

 2、end_index:切片的结束位置(!!!且不包括该位置),0表示第一个为终点,1表示第二个为终点,以此类推。-1表示倒数第一个为终点,-2表示倒数第二个为终点,以此类推。缺省时默认为序列长度(step为正数取正,step负数取负)

a=[9,2,8,7,4,5,1,5,6,8]
a[:0:]表示从第一个到第一个,一共取0个值      #[]
a[:1:]表示从第一个到第二个且不包括第二个     #[9]
a[:-1:]表示从第一个到最后一个且不包括最后一个,一共取9个值      #[9,2,8,7,4,5,1,5,6]
a[:8]表示从第一个到第九个且不包括第九个      #[9, 2, 8, 7, 4, 5, 1, 5]

 3、step,表示步长。可取正负数,正数表示从左往右,负数表示从右往左。缺省时取1

a=[9,2,8,7,4,5,1,5,6,8]
a[::1]表示从第一个到最后一个,步长为1      #[9,2,8,7,4,5,1,5,6,8]
a[::-1]表示从最后一个到第一个,步长为1       #[9,6,5,1,5,4,7,8,2,9]
a[::2]表示从第一个到最后一个,步长为2         #[9,8,4,1,6]

只有一个冒号时默认step为1。当start_index的位置在end_index的左边时,表示从左往右取值;当start_index的位置在end_index的右边时,表示从右往左取值 

>>> a = list(range(10))
 >>> a
 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
 >>> a[:5]
 [0, 1, 2, 3, 4]
 >>> a[5:]
 [5, 6, 7, 8, 9]
 >>> a[2:8]
 [2, 3, 4, 5, 6, 7]
 >>> a[::2]
 [0, 2, 4, 6, 8]
 >>> a[::-1]
 [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

基本索引

我们从Python的基本索引开始,即单个整数的索引。假设被索引的序列仍为之前提到的a,则基本索引的语法为a[index],其中index为下标。读者可能会觉得这里过于简单,但我们要强调的是Python一个语法糖:负数下标索引,即:index可以取为负数,当其为-n时,对倒数第n个元素进行索引。我们用一张表格值观展示a的索引范围。

li = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print(li[1])
# 2
print(li[9])
# 10
print(li[-5])
# 6

非负下标索引和负数下标索引共同构成了Python索引的有效范围:​。有效范围的概念对切片的理解非常重要,在基本索引中,索引超出有效范围时会抛出IndexError异常:

>>> a
 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
 >>> a[10]
 Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
 IndexError: list index out of range
 >>> a[-11]
 Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
 IndexError: list index out of range

但在切片中不是这样。

简单切片

简单切片指的是这样的切片形式:a[start:stop],其行为是得到下标在这样一个前闭后开区间范围内的元素,其中startstop为负数时,简单看作是负数下标对应的位置即可:

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

事情到这里也很简单,下面着重讲解两个比较特殊的情况:超出有效索引范围缺省

超出有效索引范围 

startstop超出上文提到的有效索引范围​时,切片操作不会抛出异常,而是进行截断。可以这样去理解截断机制:我们假象把索引范围扩充到全体整数,只不过小于​或大于​的区域对应空元素,在这个扩充后的数轴上进行切片,只需把最终结果中的所有空元素忽略即可。

来看几个具体的例子:

>>> a
 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
 >>> a[-100:5]
 [0, 1, 2, 3, 4]
 >>> a[5:100]
 [5, 6, 7, 8, 9]
 >>> a[-100:100]
 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
 >>> a[100:1000]
 []

另外,如果start的位置比stop还靠后怎么办?Python还是不会抛出异常,而是直接返回空序列:

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

缺省

startstop都是可以缺省的,在缺省的情况下,Python的行为是尽可能取最大区间,具体来说:

按照扩充索引范围的观点,start的缺省值是无穷小(​)stop的缺省值是无穷大(​)

>>> a
 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
 >>> a[:5]
 [0, 1, 2, 3, 4]
 >>> a[5:]
 [5, 6, 7, 8, 9]
 >>> a[100:]
 []

扩展切片

早期的Python解释器仅支持上述a[start:stop]形式的基本切片,后来加入了下面要介绍的切片形式,扩展切片的名称也流传下来,实际上不用担心,这早已是Python所支持的标准语法。

扩展切片指的是这样的切片形式:a[start:stop:step],其中step是一个非零整数,即比简单切片多了调整步长的功能,此时切片的行为可概括为:从start对应的位置出发,以step为步长索引序列,直至越过stop对应的位置,且不包括stop本身。事实上,简单切片就是step=1的扩展切片的特殊情况。需要详细解释的是step分别为正数和负数的两种情况。

step为正数

step为正数时,切片行为很容易理解,startstop截断缺省规则也与简单切片完全一致:

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

step为负数

step为负数时,切片将其解释为从start出发以步长|step|逆序索引序列,此时,startstop截断依然遵循前述规则,但缺省发生一点变化,因为我们说过,在缺省的情况下,Python的行为是尽可能取最大区间,此时访问是逆序的,start应尽量取大,stop应尽量取小,才能保证区间最大,因此:

按照扩充索引范围的观点,start的缺省值是无穷大(​)stop的缺省值是无穷小(​)

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

可以使用这一特性倒置序列:

li = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print(li[::-1])
# [10,9,8,7,6,5,4,3,2,1]

混合索引

起始索引和结束索引正(+)负(-)混合索引的情况

li = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print(li[1:-7:-1])
#  []
'''
起始索引1在结束索引-7的左边,因此从左往右取值,但步长为-1则决定了从右往左取值,两者矛盾,因此为空。
'''
print(li[-1:7:-1])
# [10, 9]
# 起始索引-1在结束索引7的右边,因此从右往左取值,而步长-1同样决定了从右往左取值,因此结果正确
```

几种特殊情况:

a=[9,2,8,7,4,5,1,5,6,8]
a[1:6:-1]    #step=-1表示从右往左取值,但是1:6表示从第二个到第七个从左往右,二者矛盾输出空列表
a[6:1]       #step缺省时为1,但是6:1表示从第七个到第二个从右往左,二者矛盾,输出为空
a[-1:-6]     #step缺省为1表示从左往右取值,但是-1:-6表示从倒数第一到倒数第六从右往左,矛盾输出为空
a[1:-6:-1]   #step=-1表示从右往左,1:-6表示从左往右,矛盾 输出为空
a[-1:6]      #step缺省为1从左到右,-1:6从右到左,两者矛盾,输出为空

多层切片

li = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print(li[:9][3:7][-1:])
# [7]
’‘’
相当于: 
li[:9]          =[1, 2, 3, 4, 5, 6, 7, 8, 9]
li[:9][3:7]     =[4, 5, 6, 7]
li[:9][3:7][-1:]=[7]
理论上是可以无限的进行多层切片,只要上一次的切片结果不为空
‘’‘

切片用法

读取

l = [1,2,3,4,5,6,7,8]
l[:] # 取全部元素
[1, 2, 3, 4, 5, 6, 7, 8]
l[::-1] # 逆序
[8, 7, 6, 5, 4, 3, 2, 1]
l[::2] # 取下标为偶数位的元素
[1, 3, 5, 7]
l[1::2] # 下标为奇数位
[2, 4, 6, 8]
l[2:4] # 下标为 [2,4)
[3, 4]
l[:3] # 取前3位,下标为 [0,3)
[1, 2, 3]
l[:100] # 超过数组长度时,尾部截断
[1, 2, 3, 4, 5, 6, 7, 8]
l[100:0] # 起始位置大于长度时,返回空list
[]
l[-3:] # 取后3位,下标为 [n-3,n)
[6, 7, 8]
l[3:] # 下标为 [3,n)
[4, 5, 6, 7, 8]
l[:-3] # 下标为 [0, n-3)
[1, 2, 3, 4, 5]
l[3] # 取下标为3的数
4
l[-3] #l[n-3]=l[5] #取下标为n-3的数
6
l[-1] # 最后一个数,即下标为n-1的数
8
l[2::3] # 每隔3取一个数
[3, 6]
for i in range(3):
    print(l[i:i+3]) # 窗口式读取,每次读3个数,循环3次
[1, 2, 3]
[2, 3, 4]
[3, 4, 5]

修改

l[0] = 'a' #替换l[0]
l
['a', 2, 3, 4, 5, 6, 7, 8]

插入

l[3:3] = 'c' # 在l[3]处插入元素
l
['a', 2, 3, 'c', 4, 5, 6, 7, 8]
l[:0]= 'a' # 头部插入
l
['a', 'a', 2, 3, 'c', 4, 5, 6, 7, 8]
l[len(l):0]= 'x' # 尾部插入
l
['a', 'a', 2, 3, 'c', 4, 5, 6, 7, 8, 'x']

替换

l[:4] = ['e','f'] # 替换,前4位替换为2位
l
['e', 'f', 'c', 4, 5, 6, 7, 8, 'x']
l[-3:] = ['x','y','z'] # 最后3位替换为其他3位
l
['e', 'f', 'c', 4, 5, 6, 'x', 'y', 'z']
l[::2] = [0]*5 # 奇数为置0,间隔替换时,长度需要相等 
l
[0, 'f', 0, 4, 0, 6, 0, 'y', 0]
li = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
li[2:6] = [6,6,6,6]
print(li)
# [1, 2, 6, 6, 6, 6, 7, 8, 9, 10]
a=[9,2,8,7,4,5,1,5,6,8]
print(f'{a=}')
#修改单个元素
a[3]='hello china'  #序列变为[9, 2, 8, 'hello china', 4, 5, 1, 5, 6, 8]
print(f'修改了第3个元素,{a=}')
#插入某个元素
a[3:3]='A'  #序列变为[9, 2, 8, 'A', 'hello china', 4, 5, 1, 5, 6, 8]
print(f'在第3个元素的地方插入了一个A,{a=}')
#替换一部分元素
a[3:5] = ['hello','world']  #序列变为[9, 2, 8, 'hello', 'world', 4, 5, 1, 5, 6, 8]
print(f'替换了第3、4元素,{a=}’)

‘’'
a=[9, 2, 8, 7, 4, 5, 1, 5, 6, 8]
修改了第3个元素,a=[9, 2, 8, 'hello china', 4, 5, 1, 5, 6, 8]
在第3个元素的地方插入了一个A,a=[9, 2, 8, 'A', 'hello china', 4, 5, 1, 5, 6, 8]
替换了第3、4元素,a=[9, 2, 8, 'hello', 'world', 4, 5, 1, 5, 6, 8]
‘''

删除

l[:2] = [] #删除前2位元素
l
[0, 4, 0, 6, 0, 'y', 0]
del l[:2] # 删除前2位元素
l
[0, 6, 0, 'y', 0]
del l[::2] # 删除奇数位元素
l
[6, 'y']

取奇偶数

li = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# 我们可以通过切片来进行取出li中的奇数和偶数
# 奇数
print(li[::2])
# [1, 3, 5, 7, 9]
print(li[1::2])
# [2, 4, 6, 8, 10]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/935664.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ChromeOS 的 Linux 操作系统和 Chrome 浏览器分离

导读科技媒体 Ars Technica 报道称&#xff0c;谷歌正在将 ChromeOS 的浏览器从操作系统中分离出来 —— 让它变得更像 Linux。虽然目前还没有任何官方消息&#xff0c;但这项变化可能会在本月的版本更新中推出。 据介绍&#xff0c;谷歌将该项目命名为 "Lacros"——…

防溺水预警识别系统算法

防溺水预警识别系统旨在通过opencvpython网络模型深度学习算法&#xff0c;防溺水预警识别系统算法实时监测河道环境&#xff0c;对学生等违规下水游泳等危险行为进行预警和提醒。Python是一种由Guido van Rossum开发的通用编程语言&#xff0c;它很快就变得非常流行&#xff0…

strcat函数

目录 函数介绍&#xff1a; 函数声明&#xff1a; 具体使用&#xff1a; 注意事项&#xff1a; 字符串⾃⼰给⾃⼰追加&#xff0c;如何&#xff1f; 模拟实现strcat函数&#xff1a; 函数介绍&#xff1a; 被称为字符串的追加/链接函数&#xff0c;它的功能就是在一个字符…

gcc/linux下的c++异常实现

概述 本文不一定具有很好的说教性&#xff0c;仅作为自我学习的笔记。不妨可参阅国外大神博文C exceptions under the hood链接中包含了大量的例子。 偶有在对ELF做分析的时候看到如下图一些注释&#xff0c;部分关键字看不懂&#xff0c;比如什么FDE, unwind , __gxx_perso…

【技巧分享】如何获取子窗体选择了多少记录数?一招搞定!

Hi,大家好久不见。 我这个更新速度是不是太慢了呀&#xff0c;因为&#xff0c;最近又又又在忙&#xff0c;请大家谅解啦。 现在更新文章、视频都要花好久去考虑&#xff0c;好不容易有个灵感了&#xff0c;一搜索&#xff0c;结果发现之前都已经分享过了&#xff08;委屈脸&…

Nginx详解 第三部分:Nginx高级配置(附配置实例)

Part 3 一、网页的状态页二、Nginx第三方模块2.1 echo 模块 三、变量3.1 内置变量3.1.1 常用内置变量3.1.2 举个例子 3.2 自定义变量 四、自定义访问日志 (优化)4.1 自定义访问日志的格式4.2 自定义json 格式日志 五、Nginx压缩功能&#xff08;重要&#xff09;六、HTTPS 功能…

SMC_Interpolator2Dir反向插补运动

附加函数是&#xff1a; SMC_Interpolator2Dir_SlowTask 函数的位置&#xff1a; 输入&#xff1a; 运行 bExecute 【BOOL】 路径包 poqDataIn 指向SMC_OUTQUEUE的指针 停止 bSlow_Stop 停止BOOL 急停 bEmergency_Stop 紧急停止BOOL 单…

2023.8 - java - 多态

多态是同一个行为具有多个不同表现形式或形态的能力。 多态就是同一个接口&#xff0c;使用不同的实例而执行不同操作&#xff0c; 多态的优点 1. 可替换性2 可扩充性3. 接口性、灵活性、简化性4. 消除类型之间的耦合关系 多态存在的三个必要条件 继承重写父类引用指向子类…

Java“牵手”天猫商品历史价格信息API接口数据,天猫API接口申请指南

天猫平台商品历史价格接口是开放平台提供的一种API接口&#xff0c;通过调用API接口&#xff0c;开发者可以获取天猫商品的标题、价格、库存、月销量、总销量、库存、详情描述、图片、最低价、当前价格、价格信息等详细信息 。 获取商品历史价格接口API是一种用于获取电商平台…

如何运行imbalanced-streams-master工程?

1 下载和安装JDK和Eclipse 这个步骤网上的教程特别多&#xff0c;在此就不特别叙述了。 2 将imbalanced-streams-master工程解压并引入 2.1 解压 特别要注意的是&#xff1a;解压的文件夹和workspace一定不要在同一个目录。 解压后的目录结构如下&#xff1a; 2.2 import…

图片换脸-->>视频换脸-->>直播换脸

资源网站&#xff1a;https://tianfeng.space/ 个人娱乐&#xff0c;切勿作恶 下载 ​ 网盘&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1DHMY1mCXpT0OtpmlvIoMKA 提取码&#xff1a;nf57 使用 下载解压后&#xff0c;打开 第一个就是你要替换的人脸&#xff0c;…

学习率调整策略

学习率是可以控制更新的步伐的。 我们在训练模型的时候&#xff0c;一般开始的时候学习率会比较大&#xff0c;这样可以以一个比较快的速度到达最优点的附近&#xff0c;然后再把学习率降下来&#xff0c; 缓慢的去收敛到最优值。学习率前期要大&#xff0c;后期要小 在学习学…

生成对抗网络(GAN):在图像生成和修复中的应用

文章目录 什么是生成对抗网络&#xff08;GAN&#xff09;&#xff1f;GAN在图像生成中的应用图像生成风格迁移 GAN在图像修复中的应用图像修复 拓展应用领域总结 &#x1f389;欢迎来到AIGC人工智能专栏~生成对抗网络&#xff08;GAN&#xff09;&#xff1a;在图像生成和修复…

PCI/PCIE总线的宏观理解

1、pcie总线协议实现的效果 (1)像访问内存一样去访问外设&#xff1b; (2)当建立好CPU地址空间到PCI/PCIE地址空间的映射关系后&#xff0c;程序访问CPU地址空间就可以达到访问PCI/PCIE地址空间的效果&#xff1b; 2、芯片地址空间 (1)32位的CPU寻址范围是4G&#xff0c;64位的…

【算法训练-链表】反转链表、区间反转链表、K个一组反转链表

从今天开始进行高频算法的训练&#xff0c;一方面训练自己的逻辑思维&#xff0c;一方面保持自己的竞争力。训练过程有这么两个基准原则&#xff1a; 首先训练题的来源呢有三个&#xff0c;首选的是三个都出现过的高频题&#xff0c;以&#xff1a;牛客101为基准分类&#xff…

渗透测试工具ZAP入门教程(2)-HUD教程

平视显示器 HUD是一种全新的与ZAP进行交互的方式。 它将安全信息叠加到你正在测试的应用程序上&#xff0c;并允许你访问关键的ZAP功能。 对于刚接触安全的人来说&#xff0c;它更易于理解&#xff0c;但同时也允许经验丰富的渗透测试人员将重点放在他们正在测试的应用程序上。…

计算机网络(速率、宽带、吞吐量、时延、发送时延)

速率&#xff1a; 最重要的一个性能指标。 指的是数据的传送速率&#xff0c;也称为数据率 (data rate) 或比特率 (bit rate)。 单位&#xff1a;bit/s&#xff0c;或 kbit/s、Mbit/s、 Gbit/s 等。 例如 4 1010 bit/s 的数据率就记为 40 Gbit/s。 速率往往是指额定速率或…

图床项目进度(二)——动态酷炫首页

前言&#xff1a; 前面的文章我不是说我简单copy了站友的一个登录页吗&#xff0c;我感觉还是太单调了&#xff0c;想加一个好看的背景。 但是我前端的水平哪里够啊&#xff0c;于是在网上找了找制作动态背景的插件。 效果如下图。 如何使用 这个插件是particles.js 安装…

vue2 自定义指令,插槽

一、学习目标 1.自定义指令 基本语法&#xff08;全局、局部注册&#xff09;指令的值v-loading的指令封装 2.插槽 默认插槽具名插槽作用域插槽 二、自定义指令 1.指令介绍 内置指令&#xff1a;v-html、v-if、v-bind、v-on… 这都是Vue给咱们内置的一些指令&#xff0c;…

代码随想录第31天|认识贪心算法,455.分发饼干,376. 摆动序列,53.最大子数组和

贪心的介绍 贪心的本质是选择每一阶段的局部最优&#xff0c;从而达到全局最优。 例如&#xff0c;有一堆钞票&#xff0c;你可以拿走十张&#xff0c;如果想达到最大的金额&#xff0c;你要怎么拿&#xff1f; 指定每次拿最大的&#xff0c;最终结果就是拿走最大数额的钱。…