Python进阶6——序列操作
1.序列的拼接和复制
Python中使用+对序列进行拼接,使用*对序列进行复制
s=str(1234)
l=list(range(2,13))
print(s,l)
print('----------------')
print(s*2, 3*s)#将字符串s复制并打印
print('----------------')
print(l*2)#将列表复制生成一个新的列表并打印
print('----------------')
print(s+'1234567890')#字符串拼接
print('----------------')
print(l+2*l)#列表拼接
print('----------------')
print(l,s)
上述代码的第三行和最后一行表明,列表的拼接和复制操作并不会改变原来的序列,而是生成一个全新的列表
*构建嵌套列表和列表解析式生成嵌套列表两种方法
mat1=[[0]*3 for i in range(3)]
print(mat1)
mat2=[[0]*3]*3
print(mat2)mat1[1][2]=2
print(mat1)
mat2[1][2]=3
print(mat2)
前四行代码的打印结果看起来并没有不同,但是当对嵌套列表中的元素进行修改时,可以看到这两个嵌套列表只是形式一样
当把mat1和mat2的元素的id打印出来后,可以知道其中的原因
for ele in mat1:print(id(ele))for ele in mat2:print(id(ele))
可见,mat1中的三个子列表分别指向了不同的地址空间,然而mat2中的三个子列表却指向了同一个地址空间
所以,当对mat1中的某个元素进行修改时,不会牵一发而动全身,而对mat2进行修改时,会导致其他子列表对应位置的元素也跟着改变
所以,使用列表解析式方式产生的嵌套列表稳定,而使用*生成的嵌套列表不稳定
序列的*=和+=
当对象执行*=时,会自动调用魔术方法__imul__,如果没有实现该方法,会调用__mul__,此时,a*=b等价于a=a*b,+=也是一样
当元组与*=和+=组合时,会产生新的元组
l=list(range(1,5))
t=tuple(range(1,5))
print(l,t)
print(id(l), id(t))
l*=3
t*=3
print(l,t)
print(id(l), id(t))
可见,当对列表执行*=操作后,l指向的地址空间没有变,而元组执行*=操作后,却产生了新的元组,原因就是元组的不可变性
在Python知识点3——列表操作中,最后写到元组可以被整体修改,其实并不是整体修改,只是产生了一个新的元组,然后对象指向了新的元组的地址空间,因为元组是不可变的
t2=(1,23,4)
print(id(t2))
t2=(3)
print(id(t2))
元组真的不可改变吗
当元组中的元素含有可变对象时,元组可以改变
t3=(1,2,3,[4,5])
t3[3]+=[6,7]
通过交互模式可以发现,虽然对元组中的列表进行拼接时显示了error,但是元组最终还是被改变了
一是因为+=和*=是原子操作(要不一部不执行,要不全都执行,这里+=操作全部执行结束,且中间不会因为其他软硬件原因导致该操作出现异常),二是因为列表是可变的
列表的排序,列表的排序见博客Python知识点2——列表基础
关于排序中的key参数见博客Python进阶1——一摞纸牌
bisect模块管理已排序的序列
bisect模块主要是通过二分查找来查找或者插入元素,主要的函数有bisect和insort
bisect的作用是返回插入元素的插入位置的索引
举例
import bisect
import syslistnums=[1,4,5,6,8,20,23,23,26,29,30]#已经拍好顺序的列表
insertnums=[0,1,2,5,8,10,22,23,29,30,31]#要插入的元素def demo(bisect_fn):#传入函数名print("demo")for i in insertnums:pos=bisect_fn(listnums, i)print(pos)#打入插入元素的插入位置的索引print(__name__)
if __name__ == '__main__':if sys.argv[-1]=='left':#最后一个命令行参数,类似于C++中的argc和argvbisect_fn=bisect.bisect_leftelse: bisect_fn=bisect.bisectprint(bisect_fn.__name__)#打印调用的函数名demo(bisect_fn)
执行 python3 seoperation.py的结果
bisect模块中的bisect函数是bisect_right函数名别名,将插入元素的位置放置于和它相等的元素的右边
因为0比1小,所以,0将被放置在listnum中索引为0的位置,1和1相等,所以1将被放置与listnum中1的右边,打印出的索引为1,以此类推
执行python3 seoperation.py left的结果
bisect模块中的bisect_left函数的意思是将插入元素的位置放置于和它相等的元素的左边,所以1将被放置与listnum中1的左边,打印出的索引为0
上述代码中的if __name__ == '__main__':是一个判断,如果直接运行当前文件,那么变量__name__的值就是'__main__',如果当前文件被作为一个模块导入,那么__name__的值就不是'__main__'
所以if __name__ == '__main__':用来区分当前文件是否作为一个模块被导入,如果不作为模块,那么if __name__ == '__main__':下面的代码执行,否则if __name__ == '__main__':下面的代码不执行
给定一个分数,找到对应的成绩
def getgrade(score, section=[60,70,80,90], level='FDCBA'):i=bisect.bisect(section, score)return level[i]res=[getgrade(score) for score in range(50,110,10)]
print(res)
总体思路就是通过bisect.bisect(section, score)返回分数对应的level索引,然后返回
用bisect.insort向序列中插入新元素
使用insort插入元素时,会保持序列有序
import bisect
listnums=[1,4,5,6,8,20,23,23,26,29,30]
bisect.insort(listnums, 10)
print(listnums)
参考:
《流畅的Python》
欢迎大家评论交流,作者水平有限,如有错误,欢迎指出
Python进阶6——序列操作相关推荐
- Python中的序列操作
Python中的序列操作 分类: python undefined 官方手册:https://docs.python.org/3.7/library/stdtypes.html#sequence-ty ...
- Python基础--通用序列操作
Python 继续 Python包括6种内建的序列,分别是:列表.元组.字符串.Unicode字符串.buffer对象和xrange对象.我们将逐步进行介绍. 今天主要介绍一下通用序列操作.放之四海而 ...
- python(进阶篇)——自动化操作Excel(xlrd和xlwt)
活动地址:CSDN21天学习挑战赛 学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩: 虽然永远无法预料明天是晴还是雨, 也无法预知你在乎的人是否还在身旁, 以及你一直以来的坚持究竟能否换来什么. ...
- python如何进阶提升_Python序列操作之进阶篇
简介 Python 的序列(sequence)通常指一个可迭代的容器,容器中可以存放任意类型的元素.列表和元组这两种数据类型是最常被用到的序列,python内建序列有六种,除了刚刚有说过的两种类型之外 ...
- python中的序列类型数据结构元素的切片操作_PythonI/O进阶学习笔记_4.自定义序列类(序列基类继承关系/可切片对象/推导式)...
前言: 本文代码基于python3 Content: 1.python中的序列类分类 2. python序列中abc基类继承关系 3. 由list的extend等方法来看序列类的一些特定方法 4. l ...
- python中的序列类型数据结构元素的切片操作_浅析python中的分片与截断序列
浅析python中的分片与截断序列 序列概念 在分片规则里list.tuple.str(字符串)都可以称为序列,都可以按规则进行切片操作 切片操作 注意切片的下标0代表顺序的第一个元素,-1代表倒序的 ...
- python pickle库_Python使用Pickle库实现读写序列操作示例
本文实例讲述了Python使用Pickle库实现读写序列操作.分享给大家供大家参考,具体如下: 简介 pickle模块实现了用于对Python对象结构进行序列化和反序列化的二进制协议."Pi ...
- python生成递增序列_Python的6种内建序列之通用操作
数据结构式通过某种方式(例如对元素进行编号)组织在一起的数据元素的集合,这些数据元素可以是数字或者字符,甚至可以是其他数据结构.在Python中,最基本的数据结构是序列(sequence).序列中的每 ...
- python 生成001开始的序号_你知道嘛:Python内建序列通用操作有6种实现方法(赶快收藏)...
本文内容主要介绍了Python内建序列通用操作6种实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下!!! 数据结构式通过某种方式(例如对元素进 ...
最新文章
- 通过反射获取类上的注解
- KaleidoscopeGame
- 贪吃蛇程序设计报告python_20192116 2019-2020-2 《Python程序设计》实验四报告
- Linux下区分物理CPU、逻辑CPU和CPU核数
- SQL语句、PL/SQL语句、SQL*PLUS语句结束符号
- [原创]FineUI秘密花园(二十七) — 窗体控件概述(上)
- 机器学习高级篇:解密微信视频号推荐机制
- php中fread()函数,php fread()函数
- Apache从入门到精通
- SpringBoot+zk+dubbo架构实践(三):部署Dubbo-admin管理平台
- 小米cc9出厂线刷包_小米CC9手机忘记密码一键刷机解锁 | 线刷宝刷机工具刷机包下载...
- 京瓷1125打印机清零_京瓷1125驱动下载
- 新的开始——参加培训
- :Pearl Pairing
- 具有硬件依赖性的计算机语言,具有硬件依赖性的计算机语言,被称为低级语言。下列哪些是低级语言?...
- 由先序中序得后序,中序后序得先序代码实现
- python pdf与图片互转
- HTTTP协议之POST和GEG区别
- (仿)火车头采集器 源码开源
- Android检查网络
热门文章
- Kafka Eagle 源码解读
- 修复Eclipse在Mac OSX下启动时卡住问题
- Qlikview 的服务器
- 装好Centos7后提示Initial setup of CentOS Linux 7 (core)
- inux 后台执行命令
- Map Join介绍及案例
- Vue之@click、事件修饰符@click.stop与@click.prevent、按键修饰符@keyup.enter
- 【dp】【路径压缩】P1052 过河
- BigDecimal 类型转换、运算、比较
- Linux Java Web 服务器搭建之tomcat安装