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 in symbols:
codes.append(ord(symbol))
print(codes) symbols = 'acdghlz'
codes = [ord(symbol) for symbol in symbols]
print(codes)
上述两段代码都可以将字符串变为Unicode码位,但相比于普通for循环而言列表推导式显得更简洁明了。而列表推导式只能用于生成列表,生成其他类型的序列就需要用到生成器表达式。
生成器表达式优点:生成器表达式背后遵守迭代器协议,逐个抛出元素,而不是事先建立一个完整列表再把列表传到某个构造函数中。显然生成器表达式更节省内存。
symbols = 'acdghlz'
codes_t = tuple(ord(symbol) for symbol in symbols) //构造一个元组
codes_l = list(ord(symbol) for symbol in symbols) //构造一个列表
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 in sizes): //实现笛卡儿积,逐个产生元素
print(tshirt)
元组拆包
1.元组拆包默认平行赋值:即把一个可迭代的对象里的元素一并赋值给对应的变量组成的元组中:
x_y = (60,100)
x,y = x_y
print(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 "<pyshell#11>", line 1, in <module>
l[2:5] = 100
TypeError: 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精准修改了数组某个字节:
>>> import array
>>> 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序列类型 序列:字符.列表.元组 所有序列都支持迭代 序列表示索引为非负整数的有序对象集合 字符和元组属于不可变序列,列表可变 1)字符 字符串字面量:把文本放入单引号.双引号或三引号中: ...
- Python 序列类型小结
序列是python中最基本的数据结构. 序列中每一个元素都有其对应的索引,索引是从0开始,0,1,2......依次类推 python中的序列类型有:字符串str.列表list.元组tuple.Uni ...
- python 序列类型
1.不可变的序列类型:tuple.range.str.set 001:对于tuple 类型有如下几种构造方式 1.() 构造一个空的元组. 2.a | (a,) 构造一个只有一个元素的元组. 3.tu ...
- Python序列类型各自方法
在Python输入dir(str).dir(list).dir(tuple)可查看各种序列类型的所有方法. 对于某个方法不懂怎么使用的情况,可以直接help(str.split)对某个方法进行查询. ...
- Python列表类型及常用操作
Python列表类型 1.用途: 存放多个值,可以根据索引存取值 2.定义方式: 在[ ]内用逗号分割开多个任意类型的值 l=['yven','law','lyf'] #l=list(['yven', ...
- Python序列类型方法
列表的常用方法 append.insert.extend.pop.remove 元组的两个方法count.index 字符串的常用方法及转义count.find.index.replace.split ...
- python容器类型集合的操作
集合(set):集合是一个无序的序列,集合中的元素可以是任意数据类型:表现形式是set(集合的元素),能够实现自动去重:集合传入的必须是一个hashable类型值,(不能存储字典格式的值):并且创建集 ...
- python容器类型字典的操作
字典(dict):由大括号进行描述一组键值对,其键值对之间使用冒号隔开,键值对与键值对之间使用逗号隔开: 注意:字典的key可以为数字,但是不可以重复,因为key是唯一标识符: 1.声明一个字典:语法 ...
- python容器类型元组的操作
元组:使用小括号进行表示一组元素,其元素与元素之间使用逗号隔开:注意:元组的的值是不可修改的: 1.元组值得增加:元组是不可以直接增加值的,但是可以通过+进行拼接 # 声明一个元组: tuple1 = ...
随机推荐
- 【TS】学习总结
[TS]学习总结 01-TypeScript编译环境 TypeScript全局安装 npm install typescript -g tsc --version //查看版本,安装成功 TypeSc ...
- CMD直接输入Java,Javac,Javap发生乱码解决方式
首先需要设置jdk的默认编码,在之前一篇博文里有 然后在cmd里直接执行chcp 65001 代表将cmd换成UTF-8的显示页 936是GBK 437为英语
- .Net Core with 微服务 - 分布式事务 - TCC
上一次我们讲解了分布式事务的 2PC.3PC .那么这次我们来理一下 TCC 事务.本次还是讲解 TCC 的原理跟 .NET 其实没有关系. TCC Try 准备阶段,尝试执行业务 Confirm 完 ...
- NOIP 模拟 $20\; \rm z$
题解 很考验思维的一道题 对于不同的任务点,发现如果 \(x_{i-1}<x_i<x_{i+1}\) 或 \(x_{i-1}>x_i>x_{i+1}\) 那么 \(x_i\) ...
- WPF 中的style 样式
WPF相较于以前学的WinForm,WPF在UI设计与动画方面的炫丽是最吸引我来学习的.在WPF中XMAL代码的引入使得代码的编写能够前后端分离,为获得更好的界面,也使得我们不得不分出一半的时间花在前 ...
- 03.SpringMVC之器
整体结构介绍 在Servlet的继承结构中一共有5个类,GenericServlet和HttpServlet在java中剩下的三个类HttpServletBean.FrameworkServlet和D ...
- 十:JavaWeb中的监听器(一)
2.1.基本概念 JavaWeb中的监听器是Servlet规范中定义的一种特殊类,它用于监听web应用程序中的ServletContext, HttpSession和 ServletRequest等域 ...
- Spring Boot集成Redis集群(Cluster模式)
目录 集成jedis 引入依赖 配置绑定 注册 获取redis客户端 使用 验证 集成spring-data-redis 引入依赖 配置绑定 注册 获取redis客户端 使用 验证 异常处理 同样的, ...
- BST B树 B+树
二叉排序树/二叉搜索树 (BST) 定义 左子树节点值<根节点值<右子树节点值 默认不允许两个节点的关键值相同 进行中序遍历可以得到递增的有序序列 查找效率 取决与树的高度,最好O(log ...
- TypeScript 中枚举类型的理解?应用场景?
一.是什么 枚举是一个被命名的整型常数的集合,用于声明一组命名的常数,当一个变量有几种可能的取值时,可以将它定义为枚举类型 通俗来说,枚举就是一个对象的所有可能取值的集合 在日常生活中也很常见,例如表 ...