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——序列操作相关推荐

  1. Python中的序列操作

    Python中的序列操作 分类: python undefined 官方手册:https://docs.python.org/3.7/library/stdtypes.html#sequence-ty ...

  2. Python基础--通用序列操作

    Python 继续 Python包括6种内建的序列,分别是:列表.元组.字符串.Unicode字符串.buffer对象和xrange对象.我们将逐步进行介绍. 今天主要介绍一下通用序列操作.放之四海而 ...

  3. python(进阶篇)——自动化操作Excel(xlrd和xlwt)

    活动地址:CSDN21天学习挑战赛 学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩: 虽然永远无法预料明天是晴还是雨, 也无法预知你在乎的人是否还在身旁, 以及你一直以来的坚持究竟能否换来什么. ...

  4. python如何进阶提升_Python序列操作之进阶篇

    简介 Python 的序列(sequence)通常指一个可迭代的容器,容器中可以存放任意类型的元素.列表和元组这两种数据类型是最常被用到的序列,python内建序列有六种,除了刚刚有说过的两种类型之外 ...

  5. python中的序列类型数据结构元素的切片操作_PythonI/O进阶学习笔记_4.自定义序列类(序列基类继承关系/可切片对象/推导式)...

    前言: 本文代码基于python3 Content: 1.python中的序列类分类 2. python序列中abc基类继承关系 3. 由list的extend等方法来看序列类的一些特定方法 4. l ...

  6. python中的序列类型数据结构元素的切片操作_浅析python中的分片与截断序列

    浅析python中的分片与截断序列 序列概念 在分片规则里list.tuple.str(字符串)都可以称为序列,都可以按规则进行切片操作 切片操作 注意切片的下标0代表顺序的第一个元素,-1代表倒序的 ...

  7. python pickle库_Python使用Pickle库实现读写序列操作示例

    本文实例讲述了Python使用Pickle库实现读写序列操作.分享给大家供大家参考,具体如下: 简介 pickle模块实现了用于对Python对象结构进行序列化和反序列化的二进制协议."Pi ...

  8. python生成递增序列_Python的6种内建序列之通用操作

    数据结构式通过某种方式(例如对元素进行编号)组织在一起的数据元素的集合,这些数据元素可以是数字或者字符,甚至可以是其他数据结构.在Python中,最基本的数据结构是序列(sequence).序列中的每 ...

  9. python 生成001开始的序号_你知道嘛:Python内建序列通用操作有6种实现方法(赶快收藏)...

    本文内容主要介绍了Python内建序列通用操作6种实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下!!! 数据结构式通过某种方式(例如对元素进 ...

最新文章

  1. 通过反射获取类上的注解
  2. KaleidoscopeGame
  3. 贪吃蛇程序设计报告python_20192116 2019-2020-2 《Python程序设计》实验四报告
  4. Linux下区分物理CPU、逻辑CPU和CPU核数
  5. SQL语句、PL/SQL语句、SQL*PLUS语句结束符号
  6. [原创]FineUI秘密花园(二十七) — 窗体控件概述(上)
  7. 机器学习高级篇:解密微信视频号推荐机制
  8. php中fread()函数,php fread()函数
  9. Apache从入门到精通
  10. SpringBoot+zk+dubbo架构实践(三):部署Dubbo-admin管理平台
  11. 小米cc9出厂线刷包_小米CC9手机忘记密码一键刷机解锁 | 线刷宝刷机工具刷机包下载...
  12. 京瓷1125打印机清零_京瓷1125驱动下载
  13. 新的开始——参加培训
  14. :Pearl Pairing
  15. 具有硬件依赖性的计算机语言,具有硬件依赖性的计算机语言,被称为低级语言。下列哪些是低级语言?...
  16. 由先序中序得后序,中序后序得先序代码实现
  17. python pdf与图片互转
  18. HTTTP协议之POST和GEG区别
  19. (仿)火车头采集器 源码开源
  20. Android检查网络

热门文章

  1. Kafka Eagle 源码解读
  2. 修复Eclipse在Mac OSX下启动时卡住问题
  3. Qlikview 的服务器
  4. 装好Centos7后提示Initial setup of CentOS Linux 7 (core)
  5. inux 后台执行命令
  6. Map Join介绍及案例
  7. Vue之@click、事件修饰符@click.stop与@click.prevent、按键修饰符@keyup.enter
  8. 【dp】【路径压缩】P1052 过河
  9. BigDecimal 类型转换、运算、比较
  10. Linux Java Web 服务器搭建之tomcat安装