python实用教程-第三章-列表和元组课件_第1页
python实用教程-第三章-列表和元组课件_第2页
python实用教程-第三章-列表和元组课件_第3页
python实用教程-第三章-列表和元组课件_第4页
python实用教程-第三章-列表和元组课件_第5页
已阅读5页,还剩133页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第三章列表和元组本章将引入一个新的概念:数据结构。数据结构是通过某种方式(例如对元素进行编号)组织在一起的数据元素的集合,这些元素可以是数字或者字符。在Python中,最基本的数据结构是序列(sequence)。Python包含6种内建的序列,即列表、元组、字符串、Unicode字符串、buffer对象和xrange对象。本章重点讨论最常用的两种:列表和元组。第三章列表和元组本章将引入一个新的概念:数据结构。数据结1本章引言:随着“集合号”的不断前行,我们来到了今天的旅游目的地——Python库。“集合号”在指定地方停止,Python快乐学习班的所有同学需要转乘景区的“序列号”旅游大巴通往目标景点。并由专门的导游带领他们进行参观。导游为便于带领Python快乐学习班的同学游玩,给每个人一个号码牌,编号从0开始,一直到30号。为了便于导游及早大概熟悉读者的面孔,导游安排读者根据编号对号入座,并从0号开始排队上“序列号”大巴,同学们根据序号排队上车并在对应座位号上坐下。导游为便于读者相互照应,将31名同学根据序号分成六组,前五组每组5名同学,最后一组6名同学。即第一组0至4号,第二组5至9号,第三组10至14号,第四组15至19号,第五组20至24号,第六组25至30号。本章引言:23.1通用序列操作在讲解列表和元组之前,本节先介绍Python中序列的通用操作,这些操作在列表和元组中都会用到。Python3.x中所有序列都可以进行某些特定的操作,这些操作包括:索引(indexing)、分片(sliceing)、序列相加(adding)、乘法(multiplying)、成员资格、长度、最小值和最大值。3.1通用序列操作在讲解列表和元组之前,本节先介绍Pyt33.1.1索引的定义与实现序列是Python中最基本的数据结构。序列中的每个元素都分配一个数字,代表它在序列中的位置,或索引,第一个索引是0,第二个索引是1,依此类推。序列中所有的元素都是有编号的——从0开始递增。可以通过编号分别对序列的元素进行访问。比如对于“序列号”大巴上的第二组的成员,他们的序号分别是5、6、7、8、9,将这5个序号放在一个字符串中,该字符串赋给变量group_2,意为第二组。3.1.1索引的定义与实现序列是Python中最基本的数4现对group_2做如下操作:>>>group_2='56789'#定义变量group_2,并赋值56789>>>group_2[0]#根据编号取元素,使用格式为:在方括号中输入所取元素的编号值'5'>>>group_2[1]'6'>>>group_2[2]'7'序列中的元素是从0开始从左向右依自然顺序编号的,对元素的访问可以通过编号访问。获取元素的方式为变量后面跟上中括号,中括号中输入所取元素的编号值,这个格式需要记住。现对group_2做如下操作:5如“序列号”大巴上的所有同学,目前已经从0编号到30,每个序号对应一位同学。程序中的序列也是如此。这里的所指的编号就是索引,可以通过索引获取元素。所有序列都可以通过这种方式进行索引。字符串本质是由字符组成的序列。索引值为0的指向字符串中的第一个元素。比如在上面的示例中,索引值为0指向字符串56789中的第一个字符5,索引值为1指向字符6,索引值为2指向字符7。上面的示例是从左往右顺序通过下标编号获取序列中元素的,也可以通过从右往左的逆序方式获取序列中的元素,其操作方式如下:>>>group_2[-1]'9'>>>group_2[-2]如“序列号”大巴上的所有同学,目前已经从0编号到30,每个序6'8'>>>group_2[-3]'7'>>>group_2[-4]'6'Python的序列也可以从右边开始索引,最右边的一个元素的索引为-1,向左开始递减。在Python中,从左向右索引称为正数索引,从右向左称为负数索引。使用负数索引时,Python会从最后1个元素开始计数。最后一个元素的位置编号是-1。最后一个元素的编号不是-0,这个跟数学中的概念一样的,-0=0,-0和0都是指向第一个元素。'8'73.1.2分片的定义与实现序列的索引用来对单个元素进行访问,但若需要对一个范围内的元素进行访问,使用序列的索引进行操作就相对麻烦了,这时我们就需要有一个可以快速访问指定范围元素的索引实现。Python中提供了分片的实现方式,所谓分片,就是通过冒号相隔的两个索引下标指定索引范围。比如“序列号”大巴上的同学被分成了6组,若把所有同学的序号放在一个字符串中,若想要取得第二组所有同学的序号,根据前面的做法,就需要从头开始一个一个下标去取,这样做起来不但麻烦,也耗时。若使用分片的方式,可以快速获取所有同学的序号。把所有同学的序号放在一个字符串中,各个序号使用逗号分隔,现要取得第二组所有同学的序号并打印出来。3.1.2分片的定义与实现序列的索引用来对单个元素进行访8在交互模式下输入:>>>student='0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30'>>>student[10:19] #取得第二组所有同学的序号,加上逗号分隔符,需要取得10个字符'5,6,7,8,9'>>>student[-17:-1] #负数表明从右开始计数,取得最后一组所有6名同学的序号'25,26,27,28,29,3‘分片操作既支持正数索引,也支持负数索引,并且对于从序列中获取指定部分元素非常方便。分片操作的实现需要提供两个索引作为边界,第一个索引的元素是包含在分片内的,第二个则不包含在分片内。这个像数学里面学习的a<=x<b,x是我们需要得到的元素,a是分片操作中的第一个索引,b是第二个索引,b不包含在x的需要范围内。在交互模式下输入:9接着上面的示例,假设需要得到最后一组所有6名同学的序号,使用正数索引可以这样操作:>>>student='0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30'>>>student[65:82]#取得最后一组所有6名同学的序号'25,26,27,28,29,30'接着上面的示例,假设需要得到最后一组所有6名同学的序号,使用10进行分片的时候,分片的开始和结束点都需要指定(不管是直接还是间接),用这种方式取连续的元素是没有问题的,但是若要取序列中不连续的元素就会比较麻烦了或是不能操作。比如要取序列number中的所有奇数,以一个序列展示出来,用前面的方法就不能实现了。对于这种情况,Python为我们提供了另外一个参数——步长(steplength),该参数通常是隐式设置的。在普通的分片中,步长是1——分片操作就是按照这个步长逐个遍历序列的元素,遍历后返回开始和结束点之间的所有元素,也可以理解为默认步长是1,既没有设置步长时,步长隐式设置值为1。进行分片的时候,分片的开始和结束点都需要指定(不管是直接还是11输入如下:>>>student[0:10:1][0,1,2,3,4,5,6,7,8,9]分片包含了另外一个数字。这种方式就是步长的显式设置。这个看起来和隐式设置步长没有什么区别,得到结果和之前也是一样的。但是若将步长设置为比1大的数,那结果会怎样呢?输入如下:>>>student[0:10:2][0,2,4,6,8]由输出结果可以看到,将步长设置为2时,所得到的是偶数序列。步长设置为大于1的数,那会得到一个跳过某些元素的序列。例如我们上面设置的步长为2,得到的序列是从开始到结束每隔1个的元素序列。输入如下:12比如还可以如下进行使用:>>>student[:10:3][0,3,6,9]>>>student[2:6:3][2,5]>>>student[2:5:3][2]>>>student[1:5:3][1,4]对于一个正数步长,Python会从序列的头部开始向右提取元素,直到最后一个元素;而对于负数步长,则是从序列的尾部开始向左提取元素,直到第一个元素。正数步长,必须让开始点小于结束点;而负数步长,则必须让开始点大于结束点。比如还可以如下进行使用:133.1.3序列的加法通过使用加号可以进行序列的连接操作,输入如下:>>>[1,2,3]+[4,5,6][1,2,3,4,5,6]>>>a=[1,2]>>>b=[5,6]>>>a+b[1,2,5,6]>>>s='hello,'>>>w='world'>>>s+w'hello,world'3.1.3序列的加法通过使用加号可以进行序列的连接操作,14数字序列可以和数字序列通过加号连接,连接后的结果还是数字序列,字符串序列也可以通过加号连接,连接后的结果还是字符串序列。那数字序列是否可以和字符序列相加呢?结果是怎样的,是数字序列还是字符串序列?数字序列可以和数字序列通过加号连接,连接后的结果还是数字序列15输入如下:>>>[1,2]+'hello'Traceback(mostrecentcalllast):File"<pyshell#103>",line1,in<module>[1,2]+'hello'TypeError:canonlyconcatenatelist(not"str")tolist>>>type([1,2])#取得[1,2]的类型为list<class'list'>>>>type('hello')#取得hello的类型为字符串<class'str'>数字序列和字符串序列是不能通过加号连接的。只有类型相同的序列才能通过加号进行序列连接操作,不同类型的序列不能通过加号进行序列连接操作。输入如下:163.1.4序列的乘法在Python中,序列的乘法和我们以前数学中学习的乘法需要分开理解。用一个数字n乘以一个序列会生成新的序列,在新的序列中,原来的序列将被重复n次,这个就是序列中的乘法。交互模式下输入如下:>>>'hello'*5'hellohellohellohellohello'>>>[7]*10[7,7,7,7,7,7,7,7,7,7]序列被重复了对应的次数,而不是在数学中所理解的乘法。3.1.4序列的乘法在Python中,序列的乘法和我们以前17Python中序列的乘法有什么特殊之处呢?如果要创建一个重复的序列,我们就可以像上面的示例一样乘以一个想要得到的序列长度的数字,就可以快速得到需要的列表,这样非常方便的。空列表可以简单地通过两个中括号来表示([])——表示里面什么东西都没有。如果要初始化一个长度为x的序列,需要使每个编码位置上都是空值,此时需要一个值来代表空值,即里面没有任何元素,我们需要使用None。None是Python的内建值,它的确切含义是“这里什么也没有”。例如我们输入如下:>>>sq=[None]*5#初始化sq为含有5个None的序列>>>sq[None,None,None,None,None]序列的乘法在做一些重复操作、空列表和None初始化上的操作还是挺方便的。Python中序列的乘法有什么特殊之处呢?183.1.5成员资格检测——in为了检查一个值是否在序列中,Python为我们提供了in运算符。in运算符和前面讨论过的运算符有一点不同。in运算符用于检验某个条件是否为真,并返回检验结果,检验结果为真返回True,结果为假则返回False。这种运算符称作布尔运算符,返回的真值叫做布尔值。下面我们尝试in的用法,交互模式输入如下:>>>greeting='hello,world'>>>'w'ingreeting#检测w是否在字符串中True>>>'a'ingreetingFalse使用in可以很好的检测出对于的字符或数字是否在对应的列表中。3.1.5成员资格检测——in为了检查一个值是否在序列中,193.1.6长度、最小值和最大值Python为我们提供了长度、最大值和最小值的内建函数,对应的内建函数分别为len、max和min。交互模式输入如下:>>>numbers=[300,200,100,800,500]>>>len(numbers)5>>>max(numbers)800>>>min(numbers)1003.1.6长度、最小值和最大值Python为我们提供了长20>>>max(5,3,10,7)10>>>min(7,0,3,-1)-1len函数返回序列中所包含的元素的数量,max函数和min函数则分别返回序列中最大和最小的元素。max和min函数的参数不是一个序列,而是以多个数字直接作为参数。>>>max(5,3,10,7)213.2操作列表在前面的例子中已经用了很多次列表,通过前面的示例我们看到列表的功用是比较强大的。本节将讨论列表不同于元组和字符串的地方:列表是可变的(mutable),即列表的内容是可改变的。列表有很多比较好用、比较独特的方法。3.2操作列表在前面的例子中已经用了很多次列表,通过前面223.2.1列表的更新我们在3.1节中所讲述的所有关于序列的操作,如索引、分片、相加、乘法等都适用于列表。本节将介绍一些序列中没有而列表中有的方法,这些方法的作用都是更新列表的,这些方法为:元素赋值、元素删除、分片赋值和列表方法。3.2.1列表的更新我们在3.1节中所讲述的所有关于序列的231.元素赋值前面有学习过赋值语句,这个是最简单的改变列表的方式,例如a=2这样也是一种改变列表的方式。创建一个列表,列表名为group,group中存放“序列号”上第一组所有5名同学的序号,通过编号标记某个特定位置的元素,对该位置的元素重新赋值,如group[1]=9,就可以实现元素赋值。创建列表group,赋值[0,1,2,3,4]后,计算机就在内存中为group变量开辟了一块内存空间,内存空间中存放数据的形式如下图所示。1.元素赋值24当执行group[1]=9后,计算机会找到group变量,并找到索引下标为1的内存地址,将内存为1的地址空间的值擦除,再更改上9这个值,就完成了赋值操作,如下图所示。由图可以看到,下标为1对应的数值已经更改为9了,此处为便于读者观察,在下标为1处用了一个波浪线作为特别提示。从此时开始,group列表中的值就变更为0、9、2、3、4了,后续再对group操作,就是在这个列表值的基础上进行操作了。当执行group[1]=9后,计算机会找到group变量,并25用代码实现上述操作如下:>>>group=[0,1,2,3,4]>>>group[1]=9 #索引下标为1的元素重新赋值为9>>>group[0,9,2,3,4]>>>group[3]=30 #同理,可以将索引下标为3的元素重新赋值为30>>>group[0,9,2,30,4]这里不要忘记索引下标的编号是从0开始的。用代码实现上述操作如下:26对列表中的元素赋不同类型的值。对上面得到的group列表,在交互模式下做如下尝试:>>>group[2]='xiaomeng' #对编号为2的元素赋值,赋一个字符串>>>group[0,9,'xiaomeng',30,4]>>>type(group)<class'list'>>>>type(group[1]) #别忘了查看类型函数的使用<class'int'>>>>type(group[2])<class'str'>由输出结果可以看到,可以对一个列表中的元素赋不同类型的值。对列表中的元素赋不同类型的值。对上面得到的group列表,在272.增加元素由元素赋值的示例中看到,不能为一个不存在的位置赋值,这么说就是一旦初始化了一个列表,就不能再往这个列表中增加元素了。这样若需要往列表中增加元素,就非常麻烦了,需要对整个列表中的元素都复制一遍,再添加需要增加的元素,Python中有提供对应的方法来帮助我们做这件事情。看如下输入:>>>group[0,9,'xiaomeng',30,4]>>>group.append('try')>>>group[0,9,'xiaomeng',30,4,'try']可以使用append()方法来解决。append()方法是一个用于在列表末尾添加新的对象的方法。该方法的语法如下:list.append(obj)此语法中list指的是列表,obj指的是需要添加到list列表末尾的对象。2.增加元素28append()方法操作列表时,返回的列表不是一个新列表,而是直接在原来的列表上做修改,然后将修改过的列表直接返回。如果是创建新列表,就会多出一倍的存储空间。以group列表为例,未使用append()方法之前,group列表中的内容是[0,9,'xiaomeng',30,4],这是已经占用了一块存储空间的值。使用append()方法后,若创建了新列表,就会在内存中再开辟一块新的存储空间,新开辟的存储空间中存放的内容是[0,9,'xiaomeng',30,4,'try'],和原列表比起来,就相当于增加了一倍的存储空间。而直接修改列表的情形会是这样的:内容是[0,9,'xiaomeng',30,4]的存储空间继续占有,使用append()方法后,会在现有的存储空间中增加一小块内存,用来存放新增加的try字符串,相对于原列表,仅仅增加了try字符串所占据的存储,而不是增加一倍的存储空间。append()方法操作列表时,返回的列表不是一个新列表,而293.删除元素上面学习了往列表中增加元素,那么是否可以往列表中删除元素呢?看如下示例:>>>group[0,9,'xiaomeng',30,4,'try','test']>>>len(group) #使用序列中获取长度的函数7>>>delgroup[6] #删除最后一个元素,注意索引下标与序列长度的关系>>>print('删除最后一个元素后的结果:',group)删除最后一个元素后的结果:[0,9,'xiaomeng',30,4,'try']>>>len(group)63.删除元素30>>>group[0,9,'xiaomeng',30,4,'try']>>>delgroup[2] #删除索引下标为2的元素>>>print('删除索引下标为2的元素后的结果:',group)删除索引下标为2的元素后的结果:[0,9,30,4,'try']>>>len(group)5由输出结果可以看到,使用del可以删除列表中的元素。>>>group31使用del除了可以删除列表中的字符串,也可以删除列表中的数字。在交互模式下输入:>>>group[0,9,30,4,'try']>>>len(group)5>>>delgroup[3]>>>print('删除索引下标为3的元素后的结果:',group)删除索引下标为3的元素后的结果:[0,9,30,'try']>>>len(group)4由输出结果可以看到,已经从group列表中删除了对应的数字。使用del除了可以删除列表中的字符串,也可以删除列表中的数字324.分片赋值分片赋值是列表的一个强大的特性。先看如下示例:>>>list('北京将举办2022年的冬奥会')['北','京','将','举','办','2','0','2',‘2','年','的','冬','奥','会']>>>greeting=list('welcometobeijing')>>>greeting['w','e','l','c','o','m','e','','t','o','','b','e','i','j','i','n','g']>>>greeting[11:18]['b','e','i','j','i','n','g']>>>greeting[11:18]=list('china')>>>greeting['w','e','l','c','o','m','e','','t','o','','c','h','i','n','a']可以通过分片赋值直接对列表做变更。4.分片赋值33看下面的示例:>>>field=list('ae')>>>field['a','e']>>>field[1:1]=list('bcd')>>>field['a','b','c','d','e']>>>goodnews=list('北京将举办冬奥会')>>>goodnews['北','京','将','举','办','冬','奥','会']>>>goodnews[5:5]=list('2022年的')>>>goodnews['北','京','将','举','办','2','0','2',‘2','年','的','冬','奥','会']由输出结果可以看到,使用列表的分片赋值功能,可以在不替换任何原有元素的情况下在任意位置插入新元素。看下面的示例:343.2.2多维列表目前,我们接触到的列表都是一维的,也就是一个列表里面有多个元素,每个元素对应一个数值或一个字符串。那列表中是否可以有列表呢,这里就引入了多维列表的概念。所谓多维列表,就是列表中的元素也是列表。就如“序列号”大巴上的同学,目前分成了6个小组,对于“序列号”大巴,我们可以看成是一个列表,6个小组也可以看成在“序列号”大巴里的6个列表,每个列表中又分别存放了各个同学的序号。在交互模式下表示如下:>>>bus=[[0,1,2,3,4],[5,6,7,8,9],[10,11,12,13,14],[15,16,17,18,19],[20,21,22,23,24],[25,26,27,28,29,30]]3.2.2多维列表目前,我们接触到的列表都是一维的,也就35>>>bus[[0,1,2,3,4],[5,6,7,8,9],[10,11,12,13,14],[15,16,17,18,19],[20,21,22,23,24],[25,26,27,28,29,30]]>>>group1=bus[0]>>>group1#取得第一组所有同学的序号[0,1,2,3,4]>>>type(group1)<class'list'>>>>group2=bus[1]#取得第二组所有同学的序号>>>group2[5,6,7,8,9]>>>type(group2)<class'list'>>>>bus36>>>group6=bus[5]#取得第三组所有同学的序号>>>group6[25,26,27,28,29,30]>>>type(group6)<class'list'>>>>number0=group1[0]#取得0号同学的序号>>>number00>>>number30=group6[5]#取得30号同学的序号>>>number3030在列表中可以嵌套列表,嵌套的列表取出后还是列表。>>>group6=bus[5]#取得第三组所有同学的373.2.3列表方法我们之前的章节已经介绍了函数,本节介绍一个与函数密切相关的概念——方法。方法是一个与某些对象有紧密联系的函数,对象可能是列表、数字,也可能是字符串或者其它类型的对象。方法的调用方式我们前面有一个示例,调用语法如下:对象.方法(参数)由上面的语法及前面append()方法的示例我们可知:方法的定义方式是将对象放到方法名之前,两者之间用一个点号隔开,方法后面的括号中可以根据需要带上参数。除语法上的一些不同,方法调用和函数调用很类似。列表中有count、index、sort等一些比较常用的方法,下面逐一进行介绍。3.2.3列表方法我们之前的章节已经介绍了函数,本节介绍381.append该方法前面已经介绍,其功能是在列表的末尾添加新的对象。使用方式为如前面讲解的:list.append(obj)在实际项目应用中,列表中的append()方法是使用频率最高的一个方法,涉及列表操作的,都或多或少需要用上append()方法进行元素的添加。1.append392.extendextend()方法用于在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)。extend()方法的语法如下:list.extend(seq)此语法中list代表的是列表,seq代表元素列表。该方法使用示例如下:>>>a=['hello','world']>>>b=['python','is','funny']>>>a.extend(b)>>>a['hello','world','python','is','funny']2.extend40extend()方法和序列相加有什么不同之处?extend()方法和序列相加的主要区别是:extend()方法修改了被扩展的列表;原始的连接操作会返回一个全新的列表,而不会修改原始的变量。在实际项目应用中,extend()方法也是一个使用频率较高的方法,特别在涉及多个列表合并时,使用extend()方法非常便捷。extend()方法和序列相加有什么不同之处?413.indexindex()方法用于从列表中找出某个值第一个匹配项的索引位置。index()方法的语法如下:list.index(obj)此语法中list代表的是列表,obj代表查找的对象。该方法使用示例如下:>>>field=['hello','world','python','is','funny']>>>print('hello的索引位置为:',field.index('hello'))hello的索引位置为:0>>>print('python的索引位置为:',field.index('python'))python的索引位置为:

2在实际项目应用中,index()方法的使用不是很多,在功能上,使用in可以达到和index()相同的功能,除非要返回搜索对象的具体索引位置时,才考虑使用index()方法,其他情形使用in会更高效和便捷。3.index424.insertinsert()方法用于从列表中找出某个值第一个匹配项的索引位置。insert()方法的语法:list.insert(index,obj)此语法中list代表的是列表,index代表对象obj需要插入的索引位置,obj代表要插入列表中的对象。该方法使用示例如下:>>>num=[1,2,3]>>>print('插入之前的num:',num)插入之前的num:[1,2,3]>>>num.insert(2,'插入位置在2之后,3之前')>>>print('插入之后的num:',num)插入之后的num:[1,2,'插入位置在2之后,3之前',3]在实际项目应用中,insert()方法较多地用于在列表指定位置插入指定元素,多用于单个元素的插入,当涉及大量元素插入时,使用分片赋值要更好一些。4.insert435.sortsort()方法用于对原列表进行排序,如果指定参数,则使用参数指定的比较方法进行排序。sort()方法的语法:list.sort(func)此语法中list代表的是列表,func为可选参数,如果指定了该参数会使用该参数的方法进行排序。该方法使用示例如下:>>>num=[5,8,1,3,6]>>>num.sort()>>>print('num调用sort方法后:',num)num调用sort方法后:[1,3,5,6,8]在实际项目应用中,sort()方法应用频率不是很高,在需要涉及一些稍微简单的排序时会使用sort()方法,很多时候可能需要开发者自己实现有针对性的排序方法。5.sort446.copycopy()方法用于复制列表,类似于

a[:]。copy()方法的语法:list.copy()此语法中list代表的是列表,不需要传入参数。该方法使用示例如下:>>>field=['study','python','is','happy']>>>copyfield=field.copy()>>>print('复制操作结果:',copyfield)复制操作结果:['study','python','is','happy']操作结果和该方法的意思一样,是原原本本的拷贝操作。在实际项目应用中,copy()方法的使用频率不是很高,但copy()方法是一个比较有用的方法,在列表的结构复制上很好用,效率也比较高。6.copy457.removeremove()方法用于移除列表中某个值的第一个匹配项。remove()方法的语法:list.remove(obj)此语法中list代表的是列表,obj为列表中药移除的对象。该方法使用示例如下:>>>field=['女排','精神','中国','精神','学习','精神']>>>print('移除前列表field:',field)移除前列表field:['女排','精神','中国','精神','学习','精神']>>>field.remove('精神')>>>print('移除后列表field:',field)移除后列表field:['女排','中国','精神','学习','精神']在实际项目应用中,remove()方法的使用频率不高。7.remove468.poppop()方法用于移除列表中的一个元素(默认最后一个元素),并且返回该元素的值。pop()方法的语法:list.pop(obj=list[-1])此语法中list代表的是列表,obj为可选择参数,代表要移除列表元素的对象。该方法使用示例如下:>>>field=['hello','world','python','is','funny']>>>field.pop()#不传参数,默认移除最后一个元素'funny'>>>print('移除元素后的field:',field)移除元素后的field:['hello','world','python','is']>>>field.pop(3)#移除编号为3的元素'is'8.pop47特别提醒:在Python中,pop()方法是唯一一个既能修改列表又能返回元素值(除了None)的列表方法。使用pop()方法可以实现一种常见的数据结构——栈。栈的原理就像堆放盘子一样,一次操作一个盘子,要将若干盘子堆成一堆,只能在一个盘子的上面放另一个盘子;要拿盘子时,只能从顶部一个一个地往下拿,最后放入的盘子是最先被拿的。栈也是这样,最后放入栈的元素最先被移除,称为LIFO(LastInFirstOut),即后进先出。在实际项目应用中,pop()方法的使用频率并不高,但不能以此否认pop()方法的使用价值,pop()是一个非常有使用价值的方法,在一些问题的处理上它有独特的功能特性,读者在使用时可以多加留意。特别提醒:在Python中,pop()方法是唯一一个既能修改489.reversereverse()方法用于反向列表中元素。reverse()方法的语法:list.reverse()此语法中list代表的是列表,该方法不需要传入参数。该方法使用示例如下:>>>num=[1,2,3]>>>print('列表反转前num:',num)列表反转前num:[1,2,3]>>>num.reverse()>>>print('列表反转后:',num)列表反转后:[3,2,1]在实际项目应用中,reverse()方法一般会配合sort()方法一起使用,目的是更方便于排序,为排序节省时间或内存开销,对于不同业务场景会有不同的节省方式。9.reverse4910.clearclear()方法用于清空列表,类似于

dela[:]。clear()方法的语法:list.clear()此语法中list代表的是列表,不需要传入参数。该方法使用示例如下:>>>field=['study','python','is','happy']>>>field.clear()>>>print('field调用clear方法后的结果:',field)field调用clear方法后的结果:[]在实际项目应用中,clear()方法一般应用在涉及大量列表操作,且类别元素比较多的场景中,在列表元素比较多时,一般会涉及分批次的操作,每批次操作时,为减少对内存的占用,一般会使用clear()方法先清空列表,高效且快速。10.clear5011.countcount()方法用于统计某个元素在列表中出现的次数。count()方法的语法如下:list.count(obj)此语法中list代表的是列表,obj代表列表中统计的对象。该方法使用示例如下:>>>field=list('hello,world')>>>field['h','e','l','l','o',',','w','o','r','l','d']>>>print('列表field中,字母o的个数:',field.count('o'))#统计列表中字符个数列表field中,字母o的个数:

2在实际项目应用中,count()方法用得比较少,是一个低频使用的方法。11.count5112.高级排序如果希望元素能按特定的方式进行排序可以自定义比较方法。sort方法有两个可选参数——key和reverse。看如下示例:>>>field=['study','python','is','happy']>>>field.sort(key=len)#按字符串由段到长排序>>>field.sort(key=len,reverse=True)#按字符串排序,传递两个参数>>>field['python','study','happy','is']>>>num=[5,8,1,3,6]>>>num.sort(reverse=True)#排序后逆序>>>num[8,6,5,3,1]在实际项目应用中,高级排序应用的场景比较多,也各有特色,不同的项目会有不同的需求场景,需要视具体项目而定。12.高级排序523.3操作元组Python的元组与列表类似,不同之处在于元组的元素不能修改(是否记得我们前面多次提到的字符串,它也是不能修改的)。创建元组的方法很简单:如果你使用逗号分隔了一些值,那么你就自动创建了元组。如下输入:>>>6,7,8(6,7,8)>>>'hi','python'('hi','python')该操作用逗号分隔了一些值,结果输出是元组。3.3操作元组Python的元组与列表类似,不同之处在于元533.3.1tuple函数的定义与使用tuple函数的功能和list函数基本上是一样的:以一个序列作为参数并把它转换为元组。如果参数是元组,那么参数就会被原样返回。如下输入:>>>tuple('hi')('h','i')>>>tuple(('hi','python')) #参数是元组('hi','python')>>>tuple(['hi','python']) #列表转元组('hi','python')>>>list(('hi','python')) #元组转列表['hi','python']tuple函数传入元组参数后,得到的返回值就是传入参数。3.3.1tuple函数的定义与使用tuple函数的功能543.3.2元组的基本操作和列表一样,元组也有一些基本的操作。如访问元组、修改元组、删除元组、索引和截取等操作。当然,这里的修改、删除和截取等操作和列表的操作不太一样。3.3.2元组的基本操作和列表一样,元组也有一些基本的操551.访问元组元组可以使用下标索引来访问元组中的值,看如下示例:>>>strnum=('hi','python',2017,2018)>>>print('strnum[1]is:',strnum[1])strnum[1]is:python>>>print('strnum[3]is:',strnum[3])strnum[3]is:2018>>>numbers=(1,2,3,4,5,6)>>>print('numbers[5]is:',numbers[5])numbers[5]is:6访问元组是比较普通的应用,也是元组必备的功能。1.访问元组562.元组组合元组中的元素值是不允许修改的,但我们可以对元组进行连接组合,看如下示例:>>>greeting=('hi','python')>>>yearnum=(2018,)>>>print("合并结果为:",greeting+yearnum)合并结果为:('hi','python',2018)元组连接组合的实质是生成了一个新的元组,并非是修改了原本的某一个元组。2.元组组合573.删除元组元组中的元素值是不允许删除的,但我们可以使用del语句来删除整个元组,看如下示例:>>>greeting=('hi','python')>>>greeting('hi','python')>>>print('删除元组greeting前:',greeting)删除元组greeting前:('hi','python')>>>delgreeting3.删除元组58>>>print('删除元组greeting后:',greeting)Traceback(mostrecentcalllast):File"<pyshell#281>",line1,in<module>print('删除元组greeting后:',greeting)NameError:name'greeting'isnotdefined>>>greetingTraceback(mostrecentcalllast):File"<pyshell#282>",line1,in<module>greetingNameError:name'greeting'isnotdefined以上实例元组被删除后,输出变量会有异常信息,输出结果告诉我们field没有定义,即field已经不存在了。>>>print('删除元组greeting后:',gre594.元组索引、截取因为元组也是一个序列,所以我们可以访问元组中的指定位置的元素,也可以截取索引中的一段元素,看如下示例:>>>field=('hello','world','welcome')>>>field[2]'welcome'>>>field[-2]'world'>>>field[1:]('world','welcome')4.元组索引、截取603.3.3元组内置函数Python元组提供了一些内置函数,如计算元素个数、返回最大值、最小值、列表转换等函数。len(tuple),计算元组元素个数。使用方式如下:>>>greeting=('hello','world','welcome')>>>len(greeting)3>>>greeting=('hello',)>>>len(greeting)1>>>greeting=()>>>len(greeting)03.3.3元组内置函数Python元组提供了一些内置函数61max(tuple)函数用于返回元组中元素的最大值,使用方式如下:>>>number=(39,28,99,88,56)>>>max(number)99>>>tup=('6','3','8')>>>max(tup)'8'>>>mix=(38,26,'77')>>>mix(38,26,'77')>>>max(mix)Traceback(mostrecentcalllast):File"<pyshell#296>",line1,in<module>max(mix)TypeError:'>'notsupportedbetweeninstancesof'str'and'int'max(tuple)函数既可以应用于数值元组,也可以应用于字符串元组,但是不能应用于数值和字符串混合的元组中。max(tuple)函数用于返回元组中元素的最大值,使用方式62min(tuple)函数用于返回元组中元素的最小值,使用方式如下:>>>number=(39,28,99,88,56)>>>min(number)28>>>tup=('6','3','8')>>>min(tup)'3'>>>mix=(38,26,'77')>>>mix(38,26,'77')>>>min(mix)Traceback(mostrecentcalllast):File"<pyshell#298>",line1,in<module>min(mix)TypeError:'<'notsupportedbetweeninstancesof'str'and'int'min(tuple)函数既可以应用于数值元组,也可以应用于字符串元组,但是同样不能应用于数值和字符串混合的元组中。min(tuple)函数用于返回元组中元素的最小值,使用方式633.4列表与元组的区别列表与元组的区别是元组的元素不能修改。元组一旦初始化就不能修改。不可变的元组有什么意义?因为元组不可变,所以代码更安全。如果可能,能用元组代替列表就尽量用元组。3.4列表与元组的区别列表与元组的区别是元组的元素不能修643.5活学活用——角色互换通过前面几节的学习,我们知道了列表和元组是可以相互转化的,但对于在元组中有列表的情况,元组转换为列表时,得到的会是什么结果?对于在列表中有元组的情况,列表转换为元组时,又会得到什么结果?具体代码示例参考书本代码。3.5活学活用——角色互换通过前面几节的学习,我们知道了653.6技巧点拨1.对序列中的元素进行访问时,尝试输入序列中不存在的编号,如在greeting='hello'示例中输入greeting[10],看看会得到什么结果,执行greeting[-10]又会得到什么结果。2.观察以下输入,思考会得到什么结果,并想想为什么会是这个结果。>>>max(ab,abc,abcd)Traceback(mostrecentcalllast):File"<pyshell#308>",line1,in<module>max(ab,abc,abcd)NameError:name'ab'isnotdefined>>>max('ab','abc','abcd')'abcd‘详情参考书中解答。3.6技巧点拨1.对序列中的元素进行访问时,尝试输入序列663.7问题探讨1.通用序列操作中所介绍的方法对列表和元组都通用吗?2.在实际项目应用中,根据什么来选择使用列表还是元组?3.7问题探讨1.通用序列操作中所介绍的方法对列表和元组673.8章节回顾1.回顾通用序列的基本操作,索引、分片、序列相加、乘法等分别是怎样实现的。2.回顾列表的基本操作,如何更新列表,列表的基本方法有哪些,各自怎样使用。3.回顾元组的基本操作,元组的内置函数有哪些。4.回顾列表与元组的区别。3.8章节回顾1.回顾通用序列的基本操作,索引、分片、序683.9实战演练参考书中练习3.9实战演练参考书中练习69第三章列表和元组本章将引入一个新的概念:数据结构。数据结构是通过某种方式(例如对元素进行编号)组织在一起的数据元素的集合,这些元素可以是数字或者字符。在Python中,最基本的数据结构是序列(sequence)。Python包含6种内建的序列,即列表、元组、字符串、Unicode字符串、buffer对象和xrange对象。本章重点讨论最常用的两种:列表和元组。第三章列表和元组本章将引入一个新的概念:数据结构。数据结70本章引言:随着“集合号”的不断前行,我们来到了今天的旅游目的地——Python库。“集合号”在指定地方停止,Python快乐学习班的所有同学需要转乘景区的“序列号”旅游大巴通往目标景点。并由专门的导游带领他们进行参观。导游为便于带领Python快乐学习班的同学游玩,给每个人一个号码牌,编号从0开始,一直到30号。为了便于导游及早大概熟悉读者的面孔,导游安排读者根据编号对号入座,并从0号开始排队上“序列号”大巴,同学们根据序号排队上车并在对应座位号上坐下。导游为便于读者相互照应,将31名同学根据序号分成六组,前五组每组5名同学,最后一组6名同学。即第一组0至4号,第二组5至9号,第三组10至14号,第四组15至19号,第五组20至24号,第六组25至30号。本章引言:713.1通用序列操作在讲解列表和元组之前,本节先介绍Python中序列的通用操作,这些操作在列表和元组中都会用到。Python3.x中所有序列都可以进行某些特定的操作,这些操作包括:索引(indexing)、分片(sliceing)、序列相加(adding)、乘法(multiplying)、成员资格、长度、最小值和最大值。3.1通用序列操作在讲解列表和元组之前,本节先介绍Pyt723.1.1索引的定义与实现序列是Python中最基本的数据结构。序列中的每个元素都分配一个数字,代表它在序列中的位置,或索引,第一个索引是0,第二个索引是1,依此类推。序列中所有的元素都是有编号的——从0开始递增。可以通过编号分别对序列的元素进行访问。比如对于“序列号”大巴上的第二组的成员,他们的序号分别是5、6、7、8、9,将这5个序号放在一个字符串中,该字符串赋给变量group_2,意为第二组。3.1.1索引的定义与实现序列是Python中最基本的数73现对group_2做如下操作:>>>group_2='56789'#定义变量group_2,并赋值56789>>>group_2[0]#根据编号取元素,使用格式为:在方括号中输入所取元素的编号值'5'>>>group_2[1]'6'>>>group_2[2]'7'序列中的元素是从0开始从左向右依自然顺序编号的,对元素的访问可以通过编号访问。获取元素的方式为变量后面跟上中括号,中括号中输入所取元素的编号值,这个格式需要记住。现对group_2做如下操作:74如“序列号”大巴上的所有同学,目前已经从0编号到30,每个序号对应一位同学。程序中的序列也是如此。这里的所指的编号就是索引,可以通过索引获取元素。所有序列都可以通过这种方式进行索引。字符串本质是由字符组成的序列。索引值为0的指向字符串中的第一个元素。比如在上面的示例中,索引值为0指向字符串56789中的第一个字符5,索引值为1指向字符6,索引值为2指向字符7。上面的示例是从左往右顺序通过下标编号获取序列中元素的,也可以通过从右往左的逆序方式获取序列中的元素,其操作方式如下:>>>group_2[-1]'9'>>>group_2[-2]如“序列号”大巴上的所有同学,目前已经从0编号到30,每个序75'8'>>>group_2[-3]'7'>>>group_2[-4]'6'Python的序列也可以从右边开始索引,最右边的一个元素的索引为-1,向左开始递减。在Python中,从左向右索引称为正数索引,从右向左称为负数索引。使用负数索引时,Python会从最后1个元素开始计数。最后一个元素的位置编号是-1。最后一个元素的编号不是-0,这个跟数学中的概念一样的,-0=0,-0和0都是指向第一个元素。'8'763.1.2分片的定义与实现序列的索引用来对单个元素进行访问,但若需要对一个范围内的元素进行访问,使用序列的索引进行操作就相对麻烦了,这时我们就需要有一个可以快速访问指定范围元素的索引实现。Python中提供了分片的实现方式,所谓分片,就是通过冒号相隔的两个索引下标指定索引范围。比如“序列号”大巴上的同学被分成了6组,若把所有同学的序号放在一个字符串中,若想要取得第二组所有同学的序号,根据前面的做法,就需要从头开始一个一个下标去取,这样做起来不但麻烦,也耗时。若使用分片的方式,可以快速获取所有同学的序号。把所有同学的序号放在一个字符串中,各个序号使用逗号分隔,现要取得第二组所有同学的序号并打印出来。3.1.2分片的定义与实现序列的索引用来对单个元素进行访77在交互模式下输入:>>>student='0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30'>>>student[10:19] #取得第二组所有同学的序号,加上逗号分隔符,需要取得10个字符'5,6,7,8,9'>>>student[-17:-1] #负数表明从右开始计数,取得最后一组所有6名同学的序号'25,26,27,28,29,3‘分片操作既支持正数索引,也支持负数索引,并且对于从序列中获取指定部分元素非常方便。分片操作的实现需要提供两个索引作为边界,第一个索引的元素是包含在分片内的,第二个则不包含在分片内。这个像数学里面学习的a<=x<b,x是我们需要得到的元素,a是分片操作中的第一个索引,b是第二个索引,b不包含在x的需要范围内。在交互模式下输入:78接着上面的示例,假设需要得到最后一组所有6名同学的序号,使用正数索引可以这样操作:>>>student='0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30'>>>student[65:82]#取得最后一组所有6名同学的序号'25,26,27,28,29,30'接着上面的示例,假设需要得到最后一组所有6名同学的序号,使用79进行分片的时候,分片的开始和结束点都需要指定(不管是直接还是间接),用这种方式取连续的元素是没有问题的,但是若要取序列中不连续的元素就会比较麻烦了或是不能操作。比如要取序列number中的所有奇数,以一个序列展示出来,用前面的方法就不能实现了。对于这种情况,Python为我们提供了另外一个参数——步长(steplength),该参数通常是隐式设置的。在普通的分片中,步长是1——分片操作就是按照这个步长逐个遍历序列的元素,遍历后返回开始和结束点之间的所有元素,也可以理解为默认步长是1,既没有设置步长时,步长隐式设置值为1。进行分片的时候,分片的开始和结束点都需要指定(不管是直接还是80输入如下:>>>student[0:10:1][0,1,2,3,4,5,6,7,8,9]分片包含了另外一个数字。这种方式就是步长的显式设置。这个看起来和隐式设置步长没有什么区别,得到结果和之前也是一样的。但是若将步长设置为比1大的数,那结果会怎样呢?输入如下:>>>student[0:10:2][0,2,4,6,8]由输出结果可以看到,将步长设置为2时,所得到的是偶数序列。步长设置为大于1的数,那会得到一个跳过某些元素的序列。例如我们上面设置的步长为2,得到的序列是从开始到结束每隔1个的元素序列。输入如下:81比如还可以如下进行使用:>>>student[:10:3][0,3,6,9]>>>student[2:6:3][2,5]>>>student[2:5:3][2]>>>student[1:5:3][1,4]对于一个正数步长,Python会从序列的头部开始向右提取元素,直到最后一个元素;而对于负数步长,则是从序列的尾部开始向左提取元素,直到第一个元素。正数步长,必须让开始点小于结束点;而负数步长,则必须让开始点大于结束点。比如还可以如下进行使用:823.1.3序列的加法通过使用加号可以进行序列的连接操作,输入如下:>>>[1,2,3]+[4,5,6][1,2,3,4,5,6]>>>a=[1,2]>>>b=[5,6]>>>a+b[1,2,5,6]>>>s='hello,'>>>w='world'>>>s+w'hello,world'3.1.3序列的加法通过使用加号可以进行序列的连接操作,83数字序列可以和数字序列通过加号连接,连接后的结果还是数字序列,字符串序列也可以通过加号连接,连接后的结果还是字符串序列。那数字序列是否可以和字符序列相加呢?结果是怎样的,是数字序列还是字符串序列?数字序列可以和数字序列通过加号连接,连接后的结果还是数字序列84输入如下:>>>[1,2]+'hello'Traceback(mostrecentcalllast):File"<pyshell#103>",line1,in<module>[1,2]+'hello'TypeError:canonlyconcatenatelist(not"str")tolist>>>type([1,2])#取得[1,2]的类型为list<class'list'>>>>type('hello')#取得hello的类型为字符串<class'str'>数字序列和字符串序列是不能通过加号连接的。只有类型相同的序列才能通过加号进行序列连接操作,不同类型的序列不能通过加号进行序列连接操作。输入如下:853.1.4序列的乘法在Python中,序列的乘法和我们以前数学中学习的乘法需要分开理解。用一个数字n乘以一个序列会生成新的序列,在新的序列中,原来的序列将被重复n次,这个就是序列中的乘法。交互模式下输入如下:>>>'hello'*5'hellohellohellohellohello'>>>[7]*10[7,7,7,7,7,7,7,7,7,7]序列被重复了对应的次数,而不是在数学中所理解的乘法。3.1.4序列的乘法在Python中,序列的乘法和我们以前86Python中序列的乘法有什么特殊之处呢?如果要创建一个重复的序列,我们就可以像上面的示例一样乘以一个想要得到的序列长度的数字,就可以快速得到需要的列表,这样非常方便的。空列表可以简单地通过两个中括号来表示([])——表示里面什么东西都没有。如果要初始化一个长度为x的序列,需要使每个编码位置上都是空值,此时需要一个值来代表空值,即里面没有任何元素,我们需要使用None。None是Python的内建值,它的确切含义是“这里什么也没有”。例如我们输入如下:>>>sq=[None]*5#初始化sq为含有5个None的序列>>>sq[None,None,None,None,None]序列的乘法在做一些重复操作、空列表和None初始化上的操作还是挺方便的。Python中序列的乘法有什么特殊之处呢?873.1.5成员资格检测——in为了检查一个值是否在序列中,Python为我们提供了in运算符。in运算符和前面讨论过的运算符有一点不同。in运算符用于检验某个条件是否为真,并返回检验结果,检验结果为真返回True,结果为假则返回False。这种运算符称作布尔运算符,返回的真值叫做布尔值。下面我们尝试in的用法,交互模式输入如下:>>>greeting='hello,world'>>>'w'ingreeting#检测w是否在字符串中True>>>'a'ingreetingFalse使用in可以很好的检测出对于的字符或数字是否在对应的列表中。3.1.5成员资格检测——in为了检查一个值是否在序列中,883.1.6长度、最小值和最大值Python为我们提供了长度、最大值和最小值的内建函数,对应的内建函数分别为len、max和min。交互模式输入如下:>>>numbers=[300,200,100,800,500]>>>len(numbers)5>>>max(numbers)800>>>min(numbers)1003.1.6长度、最小值和最大值Python为我们提供了长89>>>max(5,3,10,7)10>>>min(7,0,3,-1)-1len函数返回序列中所包含的元素的数量,max函数和min函数则分别返回序列中最大和最小的元素。max和min函数的参数不是一个序列,而是以多个数字直接作为参数。>>>max(5,3,10,7)903.2操作列表在前面的例子中已经用了很多次列表,通过前面的示例我们看到列表的功用是比较强大的。本节将讨论列表不同于元组和字符串的地方:列表是可变的(mutable),即列表的内容是可改变的。列表有很多比较好用、比较独特的方法。3.2操作列表在前面的例子中已经用了很多次列表,通过前面913.2.1列表的更新我们在3.1节中所讲述的所有关于序列的操作,如索引、分片、相加、乘法等都适用于列表。本节将介绍一些序列中没有而列表中有的方法,这些方法的作用都是更新列表的,这些方法为:元素赋值、元素删除、分片赋值和列表方法。3.2.1列表的更新我们在3.1节中所讲述的所有关于序列的921.元素赋值前面有学习过赋值语句,这个是最简单的改变列表的方式,例如a=2这样也是一种改变列表的方式。创建一个列表,列表名为group,group中存放“序列号”上第一组所有5名同学的序号,通过编号标记某个特定位置的元素,对该位置的元素重新赋值,如group[1]=9,就可以实现元素赋值。创建列表group,赋值[0,1,2,3,4]后,计算机就在内存中为group变量开辟了一块内存空间,内存空间中存放数据的形式如下图所示。1.元素赋值93当执行group[1]=9后,计算机会找到group变量,并找到索引下标为1的内存地址,将内存为1的地址空间的值擦除,再更改上9这个值,就完成了赋值操作,如下图所示。由图可以看到,下标为1对应的数值已经更改为9了,此处为便于读者观察,在下标为1处用了一个波浪线作为特别提示。从此时开始,group列表中的值就变更为0、9、2、3、4了,后续再对group操作,就是在这个列表值的基础上进行操作了。当执行group[1]=9后,计算机会找到group变量,并94用代码实现上述操作如下:>>>group=[0,1,2,3,4]>>>group[1]=9 #索引下标为1的元素重新赋值为9>>>group[0,9,2,3,4]>>>group[3]=30 #同理,可以将索引下标为3的元素重新赋值为30>>>gro

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论