python存储序列_python序列类型及一些操作
序列分类
1.按存放的数据类型分类:
容器类型(能存放不同类型的数据):list、tuple、coolections.deque
扁平序列(只能存放一种类型的数据):str、bytes、bytearray、memoryview、array.array
容器类型存放它们所包含的任意类型的对象的引用,而扁平类型存放的是值而不是引用。(扁平序列是一段连续的存储空间)
2.按能否被修改分类:
可变序列:list、bytearray、array.array、coolections.deque、memoryview
不可变序列:tuple、str、bytes
可变类型继承了不可变类型的一些方法,拓展了一些其他方法。
列表推导式和生成器表达式
列表推导式可以方便的把一个序列或其他可迭代类型中的元素过滤或加工,构建一个新列表。
symbols = 'acdghlz'codes=[]for symbol insymbols:
codes.append(ord(symbol))print(codes)
symbols= 'acdghlz'codes= [ord(symbol) for symbol insymbols]print(codes)
上述两段代码都可以将字符串变为Unicode码位,但相比于普通for循环而言列表推导式显得更简洁明了。而列表推导式只能用于生成列表,生成其他类型的序列就需要用到生成器表达式。
生成器表达式优点:生成器表达式背后遵守迭代器协议,逐个抛出元素,而不是事先建立一个完整列表再把列表传到某个构造函数中。显然生成器表达式更节省内存。
symbols = 'acdghlz'codes_t= tuple(ord(symbol) for symbol insymbols) //构造一个元组
codes_l= list(ord(symbol) for symbol insymbols) //构造一个列表print(codes_t)print(codes_l)
colors= ['black', 'white']
sizes= ['S','M','L']for tshirt in ('%s %s' % (c,s) for c in colors for s insizes): //实现笛卡儿积,逐个产生元素print(tshirt)
元组拆包
1.元组拆包默认平行赋值:即把一个可迭代的对象里的元素一并赋值给对应的变量组成的元组中:
x_y = (60,100)
x,y=x_yprint(x,y) //结果为:60 100
2.可以用*运算符把一个可迭代对象拆开作为函数参数:
print(divmod(20,8))
t= (20,8)print(divmod(*t))
a, b= divmod(*t)print((a,b)) //打印结果均为(2,4)
3.元组拆包时若不是对所有元素感兴趣,可使用占位符 _ 处理。
4.用*处理剩下的元素,*前缀只能用在一个变量名前,但这个变量可以出现在表达式的任意位置
a, *body, c, d = (range(7))print((a, body, c, d))*head, b, c, d = (range(7))print((head, b, c, d))//结果如下:
(0, [1, 2, 3, 4], 5, 6)
([0,1, 2, 3], 4, 5, 6)
5.具名元组
collections.namedtuple是一个工厂函数,它可以用来构建一个带字段名的元组和一个具有名字的类。具有普通元组的属性和一些专有属性。
切片
list[起始位置:结束位置:步长],三个参数均可为负数。
>>> l=[10,20,30,40,50,60]>>> l[:2]
[10, 20]>>> l[2:]
[30, 40, 50, 60]>>> l[::2]
[10, 30, 50]
切片赋值:若赋值的对象是一个切片,则赋值语句右侧必须是一个可迭代对象,如下:
>>> l = list(range(10))>>> l[2:5] = 100 //报错Traceback (most recent call last):
File"", line 1, in l[2:5] = 100TypeError: can only assign an iterable>>> l[2:5] = [100] //结果正常>>>l
[0,1, 100, 5, 6, 7, 8, 9]
list.sort和内置函数sorted
sort原地排序,即改变原对象,返回None;sorted创建一个新对象作为返回值,sorted可以接受任何可迭代对象作为参数,返回一个列表。
关键字参数reverse和key
reverse:默认为false,升序;改为true则为降序排列。
key:一个只用一个参数的函数,该函数用于序列中每一个元素,产生的结果作为排序算法依赖的对比关键字。
>>> fruits = ['grade','raspberry','apple','banana']>>>sorted(fruits)
['apple', 'banana', 'grade', 'raspberry'] //升序>>> sorted(fruits,reverse=True)
['raspberry', 'grade', 'banana', 'apple'] //降序排>>> sorted(fruits,key=len)
['grade', 'apple', 'banana', 'raspberry'] //按长度排>>> sorted(fruits,key=len,reverse=True)
['raspberry', 'banana', 'grade', 'apple'] //按长度降序>>>fruits
['grade', 'raspberry', 'apple', 'banana'] //原对象不变>>>fruits.sort() //返回空>>>fruits
['apple', 'banana', 'grade', 'raspberry'] //改变原对象
还可用bisect模块中的bisect和insort函数来在有序序列中查找或插入元素(基于二分查找算法)。
某些情况列表不是最好的选择
列表虽然既灵活有简单,但面对各种需求可能有更好的选择。
1.只需要一个只包含数字的列表,那么array.array比list高效。(数组支持所有跟可变序列有关的操作)
还提供了.frombytes和.tofile等更快读写文件的方法。参数为文件对象。
2.内存视图,memoryview是一个内置类,他能在让用户不复制内容的情况下操作同一个数组的不同切片。memoryview.cast概念跟数组模块相似,能用不同方式读写同一块内存数据,且内容字节不会随意变动。如下,用memoryview精准修改了数组某个字节:
>>> importarray>>> numbers = array.array('h',[-2,-1,0,1,2]) //利用一个短整型有符号数(类型吗h)数组创建一个memoryview>>> memv =memoryview(numbers)>>>len(memv)5
>>>memv[0]-2
>>> memv_oct = memv.cast('B') //将memoryview内容改为'B'类型,无符号字符>>>memv_oct.tolist()
[254, 255, 255, 255, 0, 0, 1, 0, 2, 0]>>> memv_oct[5] = 4 //把位置5的字节赋值成4>>>numbers
array('h', [-2, -1, 1024, 1, 2]) //第三个数高位字节改成4,故0变为1024
3.Numpy和Scipy,优秀的科学计算库。处理大量数据时必备。
4.双端队列及其他队列。
collections.deque类可以快速从两端添加或删除元素的数据类型。
queue提供了同步(线程安全)类Queue,LifoQueue,PriorityQueue,不同线程可以用这些数据类型交换信息。三个类构造方法有一个可选参数maxsize,它接受正整数作为输入值,用来限定队列大小。满员时,类不会扔掉旧的元素来腾出位置(相反,deque会扔掉旧元素插入新元素),它会锁住,直到另外的线程移除了某个元素腾出了位置。
还有multiprocessing包(用于进程间通信),asyncio包(类似queue包,但多了JoinableQueue为异步编程里的任务管理提供了专门的便利),heapq包等。
以上内容来自《流畅的python》第二章
python存储序列_python序列类型及一些操作相关推荐
- python 异常分类_Python异常类型
python标准异常 异常名称描述 BaseException所有异常的基类 SystemExit解释器请求退出 KeyboardInterrupt用户中断执行(通常是输入^C) Exception常 ...
- python可变序列_python序列中可变数据类型有什么
python与C/C++不一样,它的变量使用有自己的特点,当初学python的时候,一定要记住"一切皆为对象,一切皆为对象的引用"这句话,其实这个特点类似于JAVA,所以在pyth ...
- python 存储字典_python 字典存储
Python学习笔记--元组.列表和字典的使用笔记 Python学习笔记--元组.列表和字典的使用笔记 最近开始学习python语言,所以在学习中做了一些记录,这次讲的是元组.列表和字典的基础操作和区 ...
- python 类 字典_python基础类型—字典
字典 字典是python中唯一的映射类型,采用键值对(key-value)的形式存储数据.python对key进行哈希函数运算,根据计算的结果决定value的存储地址,所以字典是无序存储的,且key必 ...
- python 字符串交集_Python序列--集合(set)
集合 集合用于保存不重复元素. - 集合和列表非常相似 - 不同点: 1.集合中只能存储不可变对象 2.集合中存储的对象是无序(不是按照元素的插入顺序保存) 3.集合中不能出现重复的元素 集合的所有元 ...
- python字典属于无序序列_Python序列结构--字典
'&', 6), ('!', 12), ('u', 10), ('F', 9), ('W', 6), ('c', 11), ('1', 8), ('5', 6), (';', 5), ('V' ...
- python存储问题_python学习永久存储和异常处理
1 >>> importpickle2 >>> my_list = [123, 3.14, 'abc',['666']] #创建一个列表,数组等 3 >> ...
- python字符型_python字符类型
1.整型(Int) Int,整数,范围为 -2 ** 31 到 2 ** 31 - 1 ,超出这个范围便是长整型,有2进制,8进制,10进制,16进制.用8进制表示整数时,前面要加'0'的前缀,16进 ...
- python小数乘法_python小数类型
广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 在python中,数据采用了对象的形式(无论是python内置对象还是使用pyt ...
最新文章
- 对做C#自定义控件的一点心得
- 听说这是写毕业论文的你?
- language is the key
- 谋划一年,还把手机藏鞋里?00后高考作弊被判刑
- centos7-防火墙
- latex 改变字体颜色
- codebook码本算法
- freeswitch呼叫系统
- 1919: 【提高】滑翔翼
- 多媒体中控系统的发展及现状
- 暴风酷播云二期配置_暴风酷播云 一期-N3160版: 硬件折解及安装Proxmox VE-服务器虚拟化系统...
- Oracle之排序会影响rownum混乱的问题
- 实证研究的步骤_实证研究方法究竟有多重要,被这5张图惊到了!
- svm实现非线性分类(利用smo算法)
- SCRDet:Towards More Robust Detection for Small, Cluttered and Rotated Objects
- 事业单位计算机技术岗工资,事业单位管理岗和技术岗工资区别,不得不知!
- Design Compiler is not enabled Synopsys License制作
- Echarts3实例 map地图值渲染
- Unity3D无缝拼接小技巧
- 红光光浴的用途这么多,快来试试吧!
热门文章
- 【英语学习】【WOTD】teetotaler 释义/词源/示例
- Linux的进程/线程/协程系列4:进程知识深入总结:上篇
- 数据结构员工通讯录管理系统 C语言,数据结构课程设计报告单位员工通讯录管理系统.doc...
- UE3 关卡优化指南
- openGL与openGL ES 的区别
- PS 利用置换滤镜制作动感水波字
- Smack 4.3.2 发布,XMPP(jabber) 的 Java 客户端类库
- Newtonsoft.Json日常用法
- 在 Delphi 6 中使用 Hashtable
- 阿里发布天猫精灵X1 探索人机交互新大陆