Python中的序列操作
官方手册:https://docs.python.org/3.7/library/stdtypes.html#sequence-types-list-tuple-range
序列简介
序列是指按照位置顺序来存储数据的数据结构,也就是说能通过数值索引进行操作。实际上,python对序列的解释是:只要类型对象中重载了__len__()
和__getitem__()
,且它们的整数参数从0开始,就表示这个类型满足序列协议,是一个序列类型。
python有三种基本的序列类型:列表、元组和range对象。当然,还有特别定制的序列类型:str和binary data。
序列类型又分为可变序列和不可变序列。可变序列表示可以原处修改的序列,不可变序列意味着不允许原处修改。例如,列表是可变序列,字符串是不可变序列。
可变对象和不可变对象的含义,参见python可变对象和不可变对象的解释。
序列的通用操作
下面这些操作是序列通用的,无论是可变、不可变序列。但通用并不意味着所有序列都支持这些操作,有些特殊的序列因为某些原因不支持某些操作也是合理的。
注意:python中序列操作在索引越界的时候都会报错。
1.测试元素是否存在
x in S
和x not in S
,返回True或False。例如:
>>> 'a' in "abcd"
True
>>> 'aa' in "abcd"
False
>>> 'ab' in "abcd"
True
>>> 3 in [1,2,3,4]
True
2.加法和乘法符号
S1 + S2
或S * N
或N * S
,其中S1和S2是同一种序列类型,N表示序列的重复次数。
例如:
>>> [1,2] + [3,4]
[1, 2, 3, 4]
>>> [1,2] * 3
[1, 2, 1, 2, 1, 2]
>>> 3 * [1, 2]
[1, 2, 1, 2, 1, 2]
注意,序列中保存的是元素的引用地址,所以对于序列中的可变元素,+ *
时需要注意修改的影响范围:
>>> L = [1,2,3,4]
>>> L1 = [['a'],['b']]
>>> L0 = L + L1
>>> L0
[1, 2, 3, 4, ['a'], ['b']]
>>> L1[0][0] = "aa"
>>> L0
[1, 2, 3, 4, ['aa'], ['b']]
上面修改"a"为"aa"也会影响到+
的结果L0,因为['a']
是一个可变对象。同样对于*
的重复操作,也是拷贝引用:
>>> L = []
>>> L1 = [L] * 3
>>> L1
[[], [], []]
>>> L.append(3)
>>> L1
[[3], [3], [3]]
3.len()、max()和min()函数
len()返回序列的元素个数,也就是序列的长度。min()和max()分别返回序列中最小、最大的元素。
>>> len(L), min(L), max(L)
(4, 'a', 'd')
4.找出元素在序列中出现的次数count()
>>> s="hello world"
>>> s.count("h"),s.count("o")
(1, 2)
5.索引取元素
S[i]
,i为从0开始的数值,可以取负数表示从尾部开始取。
例如:
>>> L
['a', 'b', 'c', 'd']
>>> L[0]
'a'
>>> L[1]
'b'
>>> L[-1]
'd'
负数的i等价于len(S)+i
作为索引。例如,len(S) = 3, i = -1
,表示取最后一个元素,也就是index=2的元素。
6.分片
分片操作用于从序列中取出子序列,它会创建新的内存块来保存取出来的序列对象。
S[i:j]
:从索引位i取到索引位j,不包括jS[i:]
:从索引位i开始取到最结尾S[:j]
:从最开头取到索引位j,不包括jS[:]
:从头取到尾,相当于拷贝了序列,但得到的是新序列S[i:j:k]
:k表示取元素时的步进间隔,默认为1,表示每个元素都取,如果为2,则表示取一个跳过一个
分片的区间是左闭右开的,所以不会包括j的索引位。i和j可以是负数,负数表示从尾部开始计算索引位。例如,-1表示最后一个元素,-2表示倒数第二个元素。
特别地,如果i = j
,则表示找到序列中的这个位置,但因为切片长度位0,所以返回空。
例如:
>>> s = "hello world"
>>> len(s)
11
>>> s[0:6]
'hello '
>>> s[:6]
'hello '
>>> s[6:10] # 不包括index=10
'worl'
>>> s[6:11] # 所以用大于10的结束位
'world'
>>> s[6:]
'world'
>>> s[6:-1]
'worl'
>>> s[:] # 拷贝序列得到副本
'hello world'
>>> s[::1] # 步进为1,默认的
'hello world'
>>> s[::2] # 每次跳过一个元素
'hlowrd'
>>> s[1:1] # 找到index=1的位置
''
7.找出第一个元素的位置index()
index(x,i,j)
表示从序列中搜索元素x并返回第一次出现的x的位置,如果给定了i,则表示从索引位i开始搜索,给定了j则表示最多搜索到索引位为j的位置。
如果找不到元素,将报错。i和j可以是负数,但无论它们是正数还是负数,都是搜索的开始和结束位。
>>> s="hello world"
>>> s.index("o")
4
>>> s.index("o",1,-1)
4
>>> s.index("o",-5) # 从倒数第5个元素开始搜索
7
>>> s.index("a") # 搜索不到时报错
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: substring not found
不可变序列的操作
相比可变序列,不可变序列的唯一操作是可以支持内置的hash()操作。可变序列无法hash()。
>>> hash("asd")
-2014632507
>>> hash((1,23))
1320437575
>>> hash([1,23])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
能够hash的不可变序列,意味着能作为dict的key,能保存到set或frozenset中。
可变序列的操作
s[i] = x
、s[i:j] = t
将序列中的元素替换成x或可迭代对象ts[i:j:K] = t
将序列中的元素替换成可迭代对象t,t的长度必须和s[i:j:k]
的长度一样del s[i]
、del s[i:j]
删除序列中的元素,等价于s[i] = []
、s[i:j] = []
del s[i:j:k]
删除序列中的某些元素,k为步进值s.remove(x)
:移除第一次出现的元素xs.clear()
表示清空序列中的所有元素,等价于del s[:]
s.pop([i])
表示移除序列s中的第i个元素并返回这个元素,中括号表示可选,如果没有参数,默认移除最后一个元素s.append(x)
向序列的尾部追加元素x,等价于s[len(s):len(s)] = [x]
s.extend(t)
或s += t
表示将t扩展到序列s的尾部,等价于s[len(s):len(s)] = t
s.insert(i,x)
表示将x插入到序列中的i索引位置处,等价于s[i:i] = [x]
s *= n
表示将序列n的元素重复n次追加到s的尾部s.copy()
表示拷贝序列得到一个新的序列副本,等价于s[:]
s.reverse()
原地反转序列s,为了节约内存空间,所以是原地反转,不会返回反转后的序列
对于序列,还有一个内置函数reversed(SEQ)
。与之对应的,还有一个内置函数sorted(),但它操作的对象是可迭代对象,并不一定总是序列。
示例1:序列元素赋值
>>> L = ['aa','bb','cc','dd','ee','ff']
>>> L1 = [1,2,3,4]
>>> L[0] = "a"
>>> L
['a', 'bb', 'cc', 'dd', 'ee', 'ff']
>>> L[1:2] = L1
>>> L
['a', 1, 2, 3, 4, 'cc', 'dd', 'ee', 'ff']
>>> L[::2] = [1,2,3,4,5]
>>> L
[1, 1, 2, 3, 3, 'cc', 4, 'ee', 5]
示例2:删除元素
删除相关操作有del、remove()、pop()、clear()。
例如:
>>> L = ['aa','bb','cc','dd','ee','ff']
>>> del L[1]
>>> L
['aa', 'cc', 'dd', 'ee', 'ff']
>>> del L[1:2]
>>> L
['aa', 'dd', 'ee', 'ff']
>>> del L[::2]
>>> L
['dd', 'ff']
>>> L = ['aa','bb','cc','dd','ee','ff']
>>> L.remove('aa')
>>> L
['bb', 'cc', 'dd', 'ee', 'ff']
>>> L.pop()
'ff'
>>> L
['bb', 'cc', 'dd', 'ee']
>>> L.pop(2)
'dd'
>>> L
['bb', 'cc', 'ee']
>>> L.clear()
>>> L
[]
示例3:添加元素
相关操作有append()、extend()、insert()、s *= n
。
例如:
>>> L = ['aa', 'bb', 'cc', 'dd', 'ee']
>>> L1 = [1,2,3,4]
>>> L.append("ff")
>>> L
['aa', 'bb', 'cc', 'dd', 'ee', 'ff']
>>> L.insert(1,"a")
>>> L
['aa', 'a', 'bb', 'cc', 'dd', 'ee', 'ff']
>>> L.extend(L1)
>>> L
['aa', 'a', 'bb', 'cc', 'dd', 'ee', 'ff', 1, 2, 3, 4]
>>> L1 * 2
[1, 2, 3, 4, 1, 2, 3, 4]
示例4:其它操作
拷贝序列copy()、反转序列reverse()。
>>> L = ['aa', 'bb', 'cc', 'dd', 'ee']
>>> L1 = L.copy()
>>> L1
['aa', 'bb', 'cc', 'dd', 'ee']
>>> L.reverse()
>>> L
['ee', 'dd', 'cc', 'bb', 'aa']
还有一个可用于序列的内置函数reversed(),它反转序列,并返回可迭代对象。所以,如果要将它展现出来,需要构建容器。例如:
>>> L = ['aa', 'bb', 'cc', 'dd', 'ee']
>>> list(reversed(L))
['ee', 'dd', 'cc', 'bb', 'aa']
>>> set(reversed(L))
{'aa', 'bb', 'ee', 'cc', 'dd'}
Python中的序列操作的更多相关文章
- python中的赋值操作和复制操作
之前一直写C#,变量之间赋值相当于拷贝,修改拷贝变量不会改变原来的值.但是在python中发现赋值操作本质是和C++中的引用类似,即指向同一块内存空间.下面通过一个例子说明: p=[0,1,2,3,4 ...
- python中的赋值操作
参考:https://www.cnblogs.com/andywenzhi/p/7453374.html?tdsourcetag=s_pcqq_aiomsg(写的蛮好) python中的赋值操作“=” ...
- python中的日志操作和发送邮件
1.python中的日志操作 安装log模块:pip install nnlog 参数:my_log = nnlog.Logger('server_log.log',level='debug',bac ...
- python中OS模块操作文件和目录
在python中执行和操作目录和文件的操作是通过内置的python OS模块封装的函数实现的. 首先导入模块,并查看操作系统的类型: >>> import os os.name # ...
- Python中的字符串操作总结(Python3.6.1版本)
Python中的字符串操作(Python3.6.1版本) (1)切片操作: str1="hello world!" str1[1:3] <=> 'el'(左闭右开:即是 ...
- Python中的json操作
Python中的json操作 标签(空格分隔): python 编码 json 字符串前缀问题 字符串前缀可以有r,u r:表示原始(raw)字符串,比如'\n'不会被转义.常用于正则. u:表示un ...
- Python中的切片操作
python中的切片操作功能十分强大,通常我们利用切片来进行提取信息,进行相关的操作,下面就是一些切片的列子. 列如我们从range函数1-100中取7的倍数,函数及结果如下所示: >>& ...
- python中的句柄操作
python中的句柄操作 制作人:全心全意 通过窗口标题获取句柄 import win32gui hld = win32gui.FindWindow(None,u"Adobe Acrobat ...
- 第十五章、python中的进程操作-开启多进程
目录 第十五章.python中的进程操作-开启多进程 一.multprocess模块 二.multprocess.process模块 三.Process()对象方法介绍 四.Process()对象属性 ...
随机推荐
- tab选项卡--jq
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- Sql- Group By ,Where,having用法
Group by,where,having 是数据库查询中最常用的几个关键字.在工作中,时常用到,前面遇到一个问题,一个查询中使用了where ,group by ,having及聚集函数时 ,执行顺 ...
- C++的IO处理中的头文件以及类理解(2)<sstream>头文件
C++的IO处理中的头文件以及类理解(2)<sstream>头文件 头文件<sstream>中定义的类型都继承iostream头文件中定义的类型.除了继承得来的操作,sstre ...
- python中字典的操作
----------字典操作------------ --查字典1. 字典名["元素名称"]2. 字典名.get("元素名称")-获取不存在得元素名称,.get ...
- 《JavaScript 高级程序设计》读书笔记二 使用JavaScript
一 <script>元素 a.四个属性: async:立即异步加载外部脚本: defer:延迟到文档完全被解析再加载外部脚本: src:外部脚本路径: type:脚本语言的内容类型: ...
- iOS开发之Alamofire源码解析
今天博客中的Alamofire源码的版本是以3.4版本为例.上篇博客系统的对NSURLSession相关的东西进行了详细的解析,详情请看<详解NSURLSession>,为了就是给本篇博客 ...
- SQL Server 深入解析索引存储(聚集索引)
标签:SQL SERVER/MSSQL SERVER/数据库/DBA/索引体系结构/堆/聚集索引 概述 最近要分享一个课件就重新把这块知识整理了一遍出来,篇幅有点长,想要理解的透彻还是要上机实践. 聚 ...
- 背水一战 Windows 10 (102) - 应用间通信: 剪切板
[源码下载] 背水一战 Windows 10 (102) - 应用间通信: 剪切板 作者:webabcd 介绍背水一战 Windows 10 之 应用间通信 剪切板 - 基础, 复制/粘贴 text ...
- js怎么实现继承?
3. js怎么实现继承? 1. 使用原型prototype 这个问题其实之前总结过了……但是面试时候有点忘……主要思想是记得的,但是不会写,还是基础太不牢靠,写的太少了.一开始因为不知道怎么能继承父类 ...
- Android 音视频开发(二):使用 AudioRecord 采集音频PCM并保存到文件
版权声明:转载请说明出处:http://www.cnblogs.com/renhui/p/7457321.html 一.AudioRecord API详解 AudioRecord是Android系统提 ...