Python中的序列操作

分类: python

undefined

官方手册: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 中的序列类型支持哪些公共操作

    一.序列类型支持哪些公共操作 Python 中的序列类型分为:可变序列和不可变序列,都支持我们序列类型的所有操作 可变序列:列表 不可变序列:字符串和元祖 1.支持通过数字索引取值 a = (&quo ...

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

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

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

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

  4. python中的序列总结:列表,元组,字符串

    首先python中的序列有列表,元组,字符串. 列表List是python里面最基本的数据结构.序列中每个元素都是从索引(下标)从0开始,依次叠加. List操作的方法很多,只能熟悉基本常用的这个方法 ...

  5. python 中的序列

    python 中的序列 序列概述 Python 内置了多种序列,比如列表.元组和字符串. 列表和元组的主要不同在于:列表是可以修改的,而元组不可以. 在需要处理一系列值时,序列很有用.在数据库中,你可 ...

  6. python中的序列封包和序列解包

    今天我们要学的内容是python中的序列封包和序列解包,在此之前,我要先给你们讲解一下python中的序列. 可能刚接触python的朋友们都听过序列这个词,那么什么是序列呢? 序列就是可以进行索引和 ...

  7. python中有序序列是什么意思_Python中序列是什么

    在Python中,序列是有序集的通用术语.Python中有七种类型的序列. 这些是: 1.Unicode字符串 2.字符串 3.Lists 4.元组 5.字节数组 6.缓冲区 7.Xrange对象 在 ...

  8. 一文详解python中的数据库操作

    python中的数据库操作 一.数据库编程接口 1. 连接对象 二.使用内置的SQLite 1.创建数据库文件 2.操作SQLite 三.MySql数据库的使用 3.1 安装MySql 3.2 设置环 ...

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

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

最新文章

  1. t - sql的阶梯:超越基础水平2:写子查询
  2. php实现微信清粉功能,PHP实现微信提现功能
  3. Oracle 跨库查询表数据(不同的数据库间建立连接)
  4. Python基础学习01
  5. Qt学习笔记-仿大佬读取setting文件(简单工厂模式)
  6. 洗礼灵魂,修炼python(42)--巩固篇—type内置函数与类的千丝万缕关系
  7. swift 拖动按钮_ios – Swift中可拖动的UIButton / Elements?
  8. 高仿城通网盘php,PHP代码提取城通网盘直链跳过广告下载
  9. python基础之列表(八)
  10. 视频直播画质核心影响因素分析:分辨率、帧率和码率
  11. 面试数据库知识点总结
  12. Shaders for Game Programmers and Artists(7) - Non-photorealistic rendering
  13. Mysql 多表查询详解
  14. 机器人几何参数误差模型
  15. 需求分析+辽阳市水库大坝安全检测平台+志豪未来科技有限公司+陈志豪
  16. 安卓最牛教材!2021大厂Android面试经历,吐血整理
  17. python进行机器学习(四)之模型验证与参数选择
  18. 数据库三大范式的理解
  19. Solr 之 Linux 安装 solr-8.10.1
  20. c语言编辑数学公式,用C语言编个公式数学公式求助

热门文章

  1. HTML5事件—visibilitychange 页面可见性改变事件
  2. CSS-合理使用z-index控制盒子视轴高度,解决z-index失效
  3. 理解JavaScript中的原型继承(2)
  4. Javascript阻止表单提交
  5. CentOS7下安装zookeeper3.4.9
  6. 配置FCKeditor_2.6.3+fckeditor-java-2.4
  7. SRE(Simple Rule Engine) Document
  8. http --- 网关、隧道、中继
  9. OPENCV-7 学习笔记
  10. ES6-24 生成器与迭代器的应用