官方手册: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 Sx 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 + S2S * NN * 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,不包括j
  • S[i:]:从索引位i开始取到最结尾
  • S[:j]:从最开头取到索引位j,不包括j
  • S[:]:从头取到尾,相当于拷贝了序列,但得到的是新序列
  • 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中。

可变序列的操作

  1. s[i] = xs[i:j] = t将序列中的元素替换成x或可迭代对象t
  2. s[i:j:K] = t将序列中的元素替换成可迭代对象t,t的长度必须和s[i:j:k]的长度一样
  3. del s[i]del s[i:j]删除序列中的元素,等价于s[i] = []s[i:j] = []
  4. del s[i:j:k]删除序列中的某些元素,k为步进值
  5. s.remove(x):移除第一次出现的元素x
  6. s.clear()表示清空序列中的所有元素,等价于del s[:]
  7. s.pop([i])表示移除序列s中的第i个元素并返回这个元素,中括号表示可选,如果没有参数,默认移除最后一个元素
  8. s.append(x)向序列的尾部追加元素x,等价于s[len(s):len(s)] = [x]
  9. s.extend(t)s += t表示将t扩展到序列s的尾部,等价于s[len(s):len(s)] = t
  10. s.insert(i,x)表示将x插入到序列中的i索引位置处,等价于s[i:i] = [x]
  11. s *= n表示将序列n的元素重复n次追加到s的尾部
  12. s.copy()表示拷贝序列得到一个新的序列副本,等价于s[:]
  13. 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中的序列操作的更多相关文章

  1. python中的赋值操作和复制操作

    之前一直写C#,变量之间赋值相当于拷贝,修改拷贝变量不会改变原来的值.但是在python中发现赋值操作本质是和C++中的引用类似,即指向同一块内存空间.下面通过一个例子说明: p=[0,1,2,3,4 ...

  2. python中的赋值操作

    参考:https://www.cnblogs.com/andywenzhi/p/7453374.html?tdsourcetag=s_pcqq_aiomsg(写的蛮好) python中的赋值操作“=” ...

  3. python中的日志操作和发送邮件

    1.python中的日志操作 安装log模块:pip install nnlog 参数:my_log = nnlog.Logger('server_log.log',level='debug',bac ...

  4. python中OS模块操作文件和目录

    在python中执行和操作目录和文件的操作是通过内置的python OS模块封装的函数实现的. 首先导入模块,并查看操作系统的类型: >>> import os os.name # ...

  5. Python中的字符串操作总结(Python3.6.1版本)

    Python中的字符串操作(Python3.6.1版本) (1)切片操作: str1="hello world!" str1[1:3] <=> 'el'(左闭右开:即是 ...

  6. Python中的json操作

    Python中的json操作 标签(空格分隔): python 编码 json 字符串前缀问题 字符串前缀可以有r,u r:表示原始(raw)字符串,比如'\n'不会被转义.常用于正则. u:表示un ...

  7. Python中的切片操作

    python中的切片操作功能十分强大,通常我们利用切片来进行提取信息,进行相关的操作,下面就是一些切片的列子. 列如我们从range函数1-100中取7的倍数,函数及结果如下所示: >>& ...

  8. python中的句柄操作

    python中的句柄操作 制作人:全心全意 通过窗口标题获取句柄 import win32gui hld = win32gui.FindWindow(None,u"Adobe Acrobat ...

  9. 第十五章、python中的进程操作-开启多进程

    目录 第十五章.python中的进程操作-开启多进程 一.multprocess模块 二.multprocess.process模块 三.Process()对象方法介绍 四.Process()对象属性 ...

随机推荐

  1. mybatis批量更新报错badsql

    mybatis批量更新时语法写的都对,但是报错,需要在连接上面加上allowMultiQueries=true 示例:jdbc:MySQL://192.168.1.236:3306/test?useU ...

  2. opencv2.4.13+python2.7学习笔记--使用 knn对手写数字OCR

    阅读对象:熟悉knn.了解opencv和python. 1.knn理论介绍:算法学习笔记:knn理论介绍 2. opencv中knn函数 路径:opencv\sources\modules\ml\in ...

  3. 第4周小组作业:WordCount优化

     Github项目地址:https://github.com/chaseMengdi/wcPro stage1:代码编写+单元测试 PSP表格 PSP2.1 PSP阶段 预估耗时(分钟) 实际耗时(分 ...

  4. Freeradius服务器的搭建流程

    Freeradius服务器的搭建流程 一.服务器方面的配置 1 .安装radius服务器,数据库扩展插件 预先安装mysql数据库,然后安装freeradius,以及freeradius的数据库扩展插 ...

  5. MVC概述

    学习MVC模式   一.MVC简介 MVC是Model-View-Controller的简称,即模型-视图-控制器.MVC是一种设计模式,它把应用程序分成三个核心模块:模型.视图.控制器,它们各自处理 ...

  6. 不停止nginx服务,使配置文件生效

    ps -ef | grep "nginx: master process" | grep -v "grep" | awk -F ' ' '{print $2}' ...

  7. Linux安装gcc/g++

    直接使用yum安装 yum install gcc yum -y install gcc-c++ 如果为RedHat  yum需要注册 可以参考更换yum源 https://www.cnblogs.c ...

  8. Reids学习1 -- 初识Redis

    1. Reids和其他类型数据库对比 名称 类型 数据库存储选项 查询类型 附加功能 Redis 使用内存存储的非关系数据库 字符串,列表,集和,散列表,有序集合 每个类型有自己的专属命令,还有批量操 ...

  9. 使用 VSTS 进行 CI 的过程中,无法识别 .NET Core 2.x 的情况处理

    大概是由于 .NET Core 2.1 还没有正式发布,使用 VSTS 进行持续集成(CI)的过程中,自动 Build 的环节无法识别 .NET Core 2.1 的框架,查看日志会提示如下错误: V ...

  10. 13.缓存、三级缓存、内存溢出、AsyncTask

    SharePreference工具类 /** * SharePreference封装 * */ public class PrefUtils { public static final String ...