Python切片中的误区与高级用法
众所周知,我们可以通过索引值(或称下标)来查找序列类型(如字符串、列表、元组…)中的单个元素,那么,如果要获取一个索引区间的元素该怎么办呢?
切片(slice)就是一种截取索引片段的技术,借助切片技术,我们可以十分灵活地处理序列类型的对象。通常来说,切片的作用就是截取序列对象,然而,它还有一些使用误区与高级用法,都值得我们注意。所以,本文将主要跟大家一起来探讨这些内容,希望你能学有所获。
事先声明,切片并非列表的专属操作,但因为列表最具有代表性,所以,本文仅以列表为例作探讨。
1、切片的基础用法
列表是 Python 中极为基础且重要的一种数据结构,我曾写过一篇汇总文章(链接见文末)较全面地学习过它。文中详细地总结了切片的基础用法,现在回顾一下:
切片的书写形式:[i : i+n : m] ;其中,i 是切片的起始索引值,为列表首位时可省略;i+n 是切片的结束位置,为列表末位时可省略;m 可以不提供,默认值是1,不允许为0 ,当m为负数时,列表翻转。注意:这些值都可以大于列表长度,不会报越界。
切片的基本含义是:从序列的第i位索引起,向右取到后n位元素为止,按m间隔过滤 。
li = [1, 4, 5, 6, 7, 9, 11, 14, 16]# 以下写法都可以表示整个列表,其中 X >= len(li)li[0:X] == li[0:] == li[:X] == li[:] == li[::] == li[-X:X] == li[-X:]li[1:5] == [4,5,6,7] # 从1起,取5-1位元素li[1:5:2] == [4,6] # 从1起,取5-1位元素,按2间隔过滤li[-1:] == [16] # 取倒数第一个元素li[-4:-2] == [9, 11] # 从倒数第四起,取-2-(-4)=2位元素li[:-2] == li[-len(li):-2] == [1,4,5,6,7,9,11] # 从头开始,取-2-(-len(li))=7位元素# 步长为负数时,列表先翻转,再截取li[::-1] == [16,14,11,9,7,6,5,4,1] # 翻转整个列表li[::-2] == [16,11,7,5,1] # 翻转整个列表,再按2间隔过滤li[:-5:-1] == [16,14,11,9] # 翻转整个列表,取-5-(-len(li))=4位元素li[:-5:-3] == [16,9] # 翻转整个列表,取-5-(-len(li))=4位元素,再按3间隔过滤# 切片的步长不可以为0li[::0] # 报错(ValueError: slice step cannot be zero)
上述的某些例子对于初学者(甚至很多老手)来说,可能还不好理解。我个人总结出两条经验:(1)牢牢记住公式[i : i+n : m] ,当出现缺省值时,通过想象把公式补全;(2)索引为负且步长为正时,按倒数计算索引位置;索引为负且步长为负时,先翻转列表,再按倒数计算索引位置。
2、切片是伪独立对象
切片操作的返回结果是一个新的独立的序列。以列表为例,列表切片后得到的还是一个列表,占用新的内存地址。
当取出切片的结果时,它是一个独立对象,因此,可以将其用于赋值操作,也可以用于其它传递值的场景。但是,切片只是浅拷贝,它拷贝的是原列表中元素的引用,所以,当存在变长对象的元素时,新列表将受制于原列表。
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''li = [1, 2, 3, 4]ls = li[::]li == ls # Trueid(li) == id(ls) # Falseli.append(li[2:4]) # [1, 2, 3, 4, [3, 4]]ls.extend(ls[2:4]) # [1, 2, 3, 4, 3, 4]# 下例等价于判断li长度是否大于8if(li[8:]):print("not empty")else:print("empty")# 切片列表受制于原列表lo = [1,[1,1],2,3]lp = lo[:2] # [1, [1, 1]]lo[1].append(1) # [1, [1, 1, 1], 2, 3]lp # [1, [1, 1, 1]]
由于可见,将切片结果取出,它可以作为独立对象使用,但是也要注意,是否取出了变长对象的元素。
3、切片可作为占位符
切片既可以作为独立对象被“取出”原序列,也可以留在原序列,作为一种占位符使用。
对于列表来说,使用切片作为占位符,同样能够实现拼接列表的效果。特别需要注意的是,给切片赋值的必须是可迭代对象。
li = [1, 2, 3, 4]# 在头部拼接li[:0] = [0] # [0, 1, 2, 3, 4]# 在末尾拼接li[len(li):] = [5,7] # [0, 1, 2, 3, 4, 5, 7]# 在中部拼接li[6:6] = [6] # [0, 1, 2, 3, 4, 5, 6, 7]# 给切片赋值的必须是可迭代对象li[-1:-1] = 6 # (报错,TypeError: can only assign an iterable)li[:0] = (9,) # [9, 0, 1, 2, 3, 4, 5, 6, 7]li[:0] = range(3) # [0, 1, 2, 9, 0, 1, 2, 3, 4, 5, 6, 7]
上述例子中,若将切片作为独立对象取出,那你会发现它们都是空列表,即 li[:0]== li[len(li):] == li [6 : 6]==[] ,我将这种占位符称为“纯占位符”,对纯占位符赋值,并不会破坏原有的元素,只会在特定的索引位置中拼接进新的元素。删除纯占位符时,也不会影响列表中的元素。
与“纯占位符”相对应,“非纯占位符”的切片是非空列表,对它进行操作(赋值与删除),将会影响原始列表。如果说纯占位符可以实现列表的拼接,那么,非纯占位符可以实现列表的替换。
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
''' li = [1, 2, 3, 4]# 不同位置的替换li[:3] = [7,8,9] # [7, 8, 9, 4]li[3:] = [5,6,7] # [7, 8, 9, 5, 6, 7]li[2:4] = ['a','b'] # [7, 8, 'a', 'b', 6, 7]# 非等长替换li[2:4] = [1,2,3,4] # [7, 8, 1, 2, 3, 4, 6, 7]li[2:6] = ['a'] # [7, 8, 'a', 6, 7]# 删除元素del li[2:3] # [7, 8, 6, 7]
切片占位符可以带步长,从而实现连续跨越性的替换或删除效果。需要注意的是,这种用法只支持等长替换。
li = [1, 2, 3, 4, 5, 6]li[::2] = ['a','b','c'] # ['a', 2, 'b', 4, 'c', 6]li[::2] = [0]*3 # [0, 2, 0, 4, 0, 6]li[::2] = ['w'] # 报错,attempt to assign sequence of size 1 to extended slice of size 3del li[::2] # [2, 4, 6]
4、更多思考
其它编程语言是否有类似于 Python 的切片操作呢?有什么差异?
Python切片中的误区与高级用法相关推荐
- Python进阶:切片的误区与高级用法
众所周知,我们可以通过索引值(或称下标)来查找序列类型(如字符串.列表.元组...)中的单个元素,那么,如果要获取一个索引区间的元素该怎么办呢? 切片(slice)就是一种截取索引片段的技术,借助切片 ...
- Python 内置函数sorted()在高级用法
对于Python内置函数sorted(),先拿来跟list(列表)中的成员函数list.sort()进行下对比.在本质上,list的排序和内建函数sorted的排序是差不多的,连参数都基本上是一样的. ...
- 默认是字典排序法_每日一课 | Python 进阶编程之字典的高级用法
一. collections 中 defaultdict 的使用 1.1 字典的键映射多个值 将下面的列表转成字典 l = [('a',2),('b',3),('a',1),('b',4),('a', ...
- 利用python进行数据分析论文_利用Python进行数据分析之pandas的高级用法
pandas 前面我们学习了pandas两种基本的数据结构Series和DataFrame以及基本功能,这节我们学习一下其他的略高级用法. 汇总和计算描述统计 df.sum(axis=1) #求和,全 ...
- Python字典中你必须知道的用法
介绍 字典(dict)是Python中内置的一个数据结构,由多个键值对组成,键(key)和值(value)用冒号分隔,每个键值对之间用逗号(,)分隔,整个字典包括在大括号中({}),键必须是唯一的,值 ...
- linux命令 mv -v,Linux中mv命令的高级用法示例
前言 mv命令是move的缩写,可以用来移动文件或者将文件改名(move (rename) files),是Linux系统下常用的命令,经常用来备份文件或者目录. 命令格式: mv [选项] 源文件或 ...
- Python中sorted()函数的高级用法详解
sorted()函数的作用是对对象进行排序 函数函数格式: sorted(iterable,key,reverse),key参数可传入一个自定义函数 下边通过具体例子说明sorted的具体用法: 一维 ...
- Python扩展库安装工具pip的高级用法
之前发过一篇使用pip安装扩展库和Python程序打包的基础文章,请参考Python安装扩展库与打包成exe可执行文件的方法 除了前文中介绍的用法,pip工具还有很多命令可以使用,本文再介绍几个: 1 ...
- 详解Python正则表达式中group与groups的用法
在Python中,正则表达式的group和groups方法是非常有用的函数,用于处理匹配结果的分组信息. group方法是re.MatchObject类中的一个函数,用于返回匹配对象的整个匹配结果或特 ...
最新文章
- iframe中请求页面而session失效时页面跳转问题
- ubuntu16.04 wget java_Ubuntu 16.04 安装 JDK
- 操作系统(概述、组成)、用户态、内核态
- UC伯克利摘最佳论文、Hugging Face获最佳demo,EMNLP 2020奖项公布
- python编程:从入门到实践--项目1-外星人入侵_学习笔记_源码
- 关于TobjectList的一点疑问
- String与Array
- 我那个37岁的大神朋友,后续
- 在unity向量空间内绘制几何(2):计算球体的表面坐标
- 如果创业遍地,你觉得会是怎么样的景象
- UVALive 2523	Machine Schedule(二分图求最大匹配数)
- as3 socket 跨域连接
- 软件测试一个项目几个接口,你打开一个项目网址中间发生了什么?(软件测试面试题)...
- POI 操作 Excel
- 华为android怎么打开usb调试,华为PLK-AL10 开启USB调试模式
- 账号被计算机远程终止,宽带远程连接被终止怎么办
- (抖音快手)三种代码生成炫酷代码雨!!!
- vue 手写签名_与众不同的手写签批
- 数据结构实训——运动会分数统计
- 论文写作之查找中文对应的英文标题引用格式