Python中的序列操作

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'}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/255878.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

automaticallyAdjustsScrollViewInsets的作用

简单点说就是automaticallyAdjustsScrollViewInsets根据按所在界面的status bar&#xff0c;navigationbar&#xff0c;与tabbar的高度&#xff0c;自动调整scrollview的 inset,设置为no&#xff0c;不让viewController调整&#xff0c;我们自己修改布局即可~转载于:https://ww…

JavaScript 基础知识 - BOM篇

前言 本篇文章是JavaScript基础知识的BOM篇&#xff0c;如果前面的《JavaScript基础知识-DOM篇》看完了&#xff0c;现在就可以学习BOM了。 注意&#xff1a; 所有的案例都在这里链接: 提取密码密码: yvxo&#xff0c;文章中的每个案例后面都有对应的序号。 1. BOM 基本概念 B…

全球首例机器人自杀事件 因受够无聊家务

据凤凰网,一个奥地利家庭购买一小机器人,每天工作就是倒垃圾、倒垃圾。一天完工后,它竟自己启动,爬到炉边&#xff0c;推开上面的锅&#xff0c;把自己活活烧死…专家称这个机器人实在受够了无聊的家务琐事&#xff0c;才毅然选择自杀机器人也是有尊严的!为这有骨气的robot点根…

【python基础】——数据类型(列表、字典、集合)

骏马金龙——python语法基础 python基础 变量与运算 符号//%**意义整除整除取余幂次方数据种类 #mermaid-svg-7nSRRijcYFCYwTDr .label{font-family:trebuchet ms, verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-7nSRRijcYFCYw…

linux命令:mkdir命令

命令参数&#xff1a; -m, --mode模式&#xff0c;设定权限<模式> (类似 chmod)&#xff0c;而不是 rwxrwxrwx 减 umask -p, --parents 可以是一个路径名称。此时若路径中的某些目录尚不存在,加上此选项后,系统将自动建立好那些尚不存在的目录,即一次可以建立多个目录; …

js设置奇偶行数样式

$(document).ready(function () {odd { "background": "none" }; //奇数样式 even { "background": "#f3f3f3" }; //偶数样式 odd_even(".gys_xq", odd, even);});function odd_even(id, odd, even) {$(id).find("…

贝塞尔曲线切割圆角

ios 系统框架已经给我们提供了相应的切割圆角的方法, 但是如果在一个见面有很多控件切割的话会出现卡顿和个别不切的现象 ?123456789101112131415161718192021222324252627/* 创建一个Button */UIButton * button [UIButton buttonWithType:(UIButtonTypeSystem)];[button se…

机器人实现屠宰自动化

当 WESTFLEISCH 注册合作社考虑在 Coesfeld 肉类加工中心内自动化原有的人工屠宰设备过程时&#xff0c;首先在“剔除直肠”及“切开盆腔骨及腹部”两个流程中测试使用了两台库卡机器人。在此过程中&#xff0c;机器人主要以它工作的质量及经济效益说服了使用者。 实施措施/解…

DOM编程艺术12章

在submit.html中&#xff0c;代码简略成如下也行 <article><h1>Thanks!</h1><p>Thanks for contacting us. Well get back to you as soon as we can.</p></article> </body> </html> 说明了只是插入article的部分&#xff0c…

python数据结构《排序专题复习》

目录 常见的三种排序方法 冒泡排序 插入排序 选择排序 其他经典的排序方法 快速排序 堆排序 归并排序 希尔排序 不同排序方法的各维度对比 排序方式的稳定性&#xff1a;若两个相同的元素在排序前后的相对位置不发生改变的排序为稳定排序&#xff0c;否则不稳定排序 常…

BZOJ2844 albus就是要第一个出场

AC通道&#xff1a;http://www.lydsy.com/JudgeOnline/problem.php?id2844 这题貌似HDU上有一道差不多的题&#xff0c;不过我没做过&#xff0c;也就没管了。 首先讲一个线性基的东西&#xff0c;大概就是这样&#xff1a; 然后就是一个什么性质&#xff1a;S异或起来会出现重…

HTG Explains: Why Linux Doesn’t Need Defragmenting

If you’re a Linux user, you’ve probably heard that you don’t need to defragment your Linux file systems. You’ll also notice that Linux distributions don’t come with disk-defragmenting utilities. But why is that? To understand why Linux file systems d…

Spring AOP 实战运用

Spring AOP 实战 看了上面这么多的理论知识, 不知道大家有没有觉得枯燥哈. 不过不要急, 俗话说理论是实践的基础, 对 Spring AOP 有了基本的理论认识后, 我们来看一下下面几个具体的例子吧.下面的几个例子是我在工作中所遇见的比较常用的 Spring AOP 的使用场景, 我精简了很多有…

VC Ws2_32.lib

该库对应WS2_32.DLL&#xff0c;提供了对以下网络相关API的支持&#xff0c;若使用其中的API&#xff0c;则应该将ws2_32.lib加入工程&#xff08;否则要动态载入WS2_32.DLL&#xff09;。acceptbindcloseSOCKETconnectgetpeernamegetsocknamegetsockopthtonlhtonsioctlsocketi…

大话设计模式之策略模式

第二章&#xff1a;商场促销——策略模式 策略模式的定义:策略模式是一种定义一系列算法的方法&#xff0c;从概念上来看&#xff0c;所有这些算法完成的都是相同的工作&#xff0c;知识实现不同&#xff0c;他可以以相同的方式调用所有的算法&#xff0c;减少了各类算法类与使…

【Python学习】——语言风格(变量赋值、深浅拷贝、for循环陷阱)

目录 1、赋值 2、赋值的分类——引用赋值、值赋值 1) 不可变对象引用赋值——字符串、数值、元组等 2&#xff09;可变对象引用赋值——列表、集合、字典 3&#xff09;可变与不可变对象的引用赋值内部分析 4&#xff09;在py文件中&#xff0c;和作用域有关&#xff0c;如…

underscore.js 页面数据渲染

1.underscore.js 源码 // Underscore.js 1.8.3 // http://underscorejs.org // (c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors // Underscore may be freely distributed under the MIT license.(function() {// …

判断庄家是否出货

1. 大盘处于强势的时候 日平均线在横盘的时候&#xff0c;缓慢拉升然后急剧下跌 高位盘整的时候 2. 有利好消息发布的时候 因为庄家会利用这个对于散户来说这个买入时机来进行出货操作&#xff0c;可见庄家真是阴险狡诈转载于:https://www.cnblogs.com/dcz1001/p/6115893.html

【深度学习】——常见深度学习模型总结、anchor-free和anchor-based

目录 1、faster rcnn&#xff1a; 2、SSD&#xff1a; 3、YOLOv1: 小结&#xff1a; 拓展&#xff1a;anchor-based和anchor-free anchor 1、faster rcnn&#xff1a; FasterRcnn 算法原理讲解笔记&#xff08;非常详细&#xff09;https://blog.csdn.net/xjtdw/article…

PHP PDO函数库详解

PDO是一个“数据库访问抽象层”&#xff0c;作用是统一各种数据库的访问接口&#xff0c;与mysql和mysqli的函数库相比&#xff0c;PDO让跨数据库的使用更具有亲和力&#xff1b;与ADODB和MDB2相比&#xff0c;PDO更高效。目前而言&#xff0c;实现“数据库抽象层”任重而道远&…