您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 交通运输 > 第2章-Python序列(Python程序设计董付国清华大学出版社教材配套精排版)
第2章Python序列主讲XXX1CONTENTS目录01列表有序可变04集合无序可变不重复03字典无序可变02元组有序不可变05sorted函数内置函数再解析06复杂数据结构堆、队列、栈等Python序列概述Python序列类似于其他语言中的数组,但功能要强大很多。Python中常用的序列结构有列表、元组、字符串,字典、集合以及range等对象也支持很多类似的操作。列表、元组、字符串支持双向索引,第一个元素下标为0,第二个元素下标为1,以此类推;最后一个元素下标为-1,倒数第二个元素下标为-2,以此类推。32.1列表列表是Python中内置有序可变序列,列表的所有元素放在一对中括号“[]”中,并使用逗号分隔开;当列表元素增加或删除时,列表对象自动进行扩展或收缩内存,保证元素之间没有缝隙;在Python中,一个列表中的数据类型可以各不相同,可以同时混搭各类对象。[10,20,30,40]['crunchyfrog','rambladder','larkvomit']['spam',2.0,5,[10,20]][['file1',200,7],['file2',260,9]]42.1列表方法说明lst.append(x)将元素x添加至列表lst尾部lst.extend(L)将列表L中所有元素添加至列表lst尾部lst.insert(index,x)在列表lst指定位置index处添加元素x,该位置后面的所有元素后移一个位置lst.remove(x)在列表lst中删除首次出现的指定元素,该元素之后的所有元素前移一个位置lst.pop([index])删除并返回列表lst中下标为index(默认为-1)的元素lst.clear()删除列表lst中所有元素,但保留列表对象lst.index(x)返回列表lst中第一个值为x的元素的下标,若不存在值为x的元素则抛出异常lst.count(x)返回指定元素x在列表lst中的出现次数lst.reverse()对列表lst所有元素进行逆序lst.sort(key=None,reverse=False)对列表lst中的元素进行排序,key用来指定排序依据,reverse决定升序(False)还是降序(True)lst.copy()返回列表lst的浅复制列表常用方法52.1.1列表创建与删除使用“=”直接将一个列表赋值给变量即可创建列表对象a_list=['a','b','mpilgrim','z','example']a_list=[]#创建空列表也可以使用list()函数将元组、range对象、字符串或其他类型的可迭代对象类型的数据转换为列表。a_list=list((3,5,7,9,11))a_list[3,5,7,9,11]list(range(1,10,2))[1,3,5,7,9]list('helloworld')['h','e','l','l','o','','w','o','r','l','d']x=list()#创建空列表62.1.1列表创建与删除当不再使用时,使用del命令删除整个列表,如果列表对象所指向的值不再有其他对象指向,Python将同时删除该值。dela_lista_listTraceback(mostrecentcalllast):Filepyshell#6,line1,inmodulea_listNameError:name'a_list'isnotdefined72.1.2列表元素的增加(1)可以使用“+”运算符将元素添加到列表中。aList=[3,4,5]aList=aList+[7]aList[3,4,5,7]严格意义上来讲,这并不是真的为列表添加元素,而是创建一个新列表,并将原列表中的元素和新元素依次复制到新列表的内存空间。由于涉及大量元素的复制,该操作速度较慢,在涉及大量元素添加时不建议使用该方法。82.1.2列表元素的增加(2)使用列表对象的append()方法,原地修改列表,是真正意义上的在列表尾部添加元素,速度较快。aList.append(9)aList[3,4,5,7,9]所谓“原地”,是指不改变列表在内存中的首地址。92.1.2列表元素的增加下面的代码比较了“+”和append()这两种方法的速度差异:importtimeresult=[]start=time.time()foriinrange(10000):result=result+[i]print(len(result),',',time.time()-start)result=[]start=time.time()foriinrange(10000):result.append(i)print(len(result),',',time.time()-start)10000,0.2180120944976806610000,0.003000020980834961102.1.2列表元素的增加Python采用的是基于值的自动内存管理方式,当为对象修改值时,并不是真的直接修改变量的值,而是使变量指向新的值,这对于Python所有类型的变量都是一样的。a=[1,2,3]id(a)#返回对象的内存地址20230752a=[1,2]id(a)20338208112.1.2列表元素的增加列表中包含的是元素值的引用,而不是直接包含元素值。如果是直接修改序列变量的值,则与Python普通变量的情况是一样的。而如果是通过下标来修改序列中元素的值或通过可变序列对象自身提供的方法来增加和删除元素时,序列对象在内存中的起始地址是不变的,仅仅是被改变值的元素地址发生变化,也就是所谓的“原地操作”。122.1.2列表元素的增加a=[1,2,4]b=[1,2,3]a==bFalseid(a)==id(b)Falseid(a[0])==id(b[0])Truea.remove(3)a[1,2,4]id(a)25289752a[0]=5a[5,2,4]id(a)25289752id(b)25289752b.append(4)id(b)25289752132.1.2列表元素的增加(3)使用列表对象的extend()方法可以将另一个迭代对象的所有元素添加至该列表对象尾部。通过extend()方法来增加列表元素也不改变其内存首地址,属于原地操作。aList.extend((15,17))aList[3,4,5,7,9,11,13,15,17]id(a)25289752aList.extend([7,8,9])aList[5,2,4,7,8,9]aList.extend([11,13])aList[3,4,5,7,9,11,13]142.1.2列表元素的增加(4)使用列表对象的insert()方法将元素添加至列表的指定位置。aList.insert(3,6)#在下标为3的位置插入元素6aList[3,4,5,6,7,9,11,13,15,17]152.1.2列表元素的增加应尽量从列表尾部进行元素的增加与删除操作。列表的insert()可以在列表的任意位置插入元素,但由于列表的自动内存管理功能,insert()方法会涉及到插入位置之后所有元素的移动,这会影响处理速度。类似的还有后面介绍的remove()方法以及使用pop()函数弹出列表非尾部元素和使用del命令删除列表非尾部元素的情况。162.1.2列表元素的增加importtimedefInsert():a=[]foriinrange(10000):a.insert(0,i)defAppend():a=[]foriinrange(10000):a.append(i)运行结果如下:Insert:0.578000068665Append:0.0309998989105start=time.time()foriinrange(10):Insert()print('Insert:',time.time()-start)start=time.time()foriinrange(10):Append()print('Append:',time.time()-start)172.1.2列表元素的增加(5)使用乘法来扩展列表对象,将列表与整数相乘,生成一个新列表,新列表是原列表中元素的重复。aList=[3,5,7]bList=aListid(aList)57091464id(bList)57091464aList=aList*3aList[3,5,7,3,5,7,3,5,7]bList[3,5,7]id(aList)57092680id(bList)57091464182.1.2列表元素的增加当使用*运算符将包含列表的列表重复并创建新列表时,并不创建元素的复制,而是创建已有对象的引用。因此,当修改其中一个值时,相应的引用也会被修改。x=[[None]*2]*3x[[None,None],[None,None],[None,None]]x[0][0]=5x[[5,None],[5,None],[5,None]]x=[[1,2,3]]*3x[0][0]=10x[[10,2,3],[10,2,3],[10,2,3]]192.1.3列表元素的删除(1)使用del命令删除列表中的指定位置上的元素。a_list=[3,5,7,9,11]dela_list[1]a_list[3,7,9,11]202.1.3列表元素的删除(2)使用列表的pop()方法删除并返回指定(默认为最后一个)位置上的元素,如果给定的索引超出了列表的范围则抛出异常。a_list=list((3,5,7,9,11))a_list.pop()11a_list[3,5,7,9]a_list.pop(1)5a_list[3,7,9]pop也是原位操作,不改变原列表的地址。212.1.3列表元素的删除(3)使用列表对象的remove()方法删除首次出现的指定元素,如果列表中不存在要删除的元素,则抛出异常。a_list=[3,5,7,9,7,11]a_list.remove(7)a_list[3,5,9,7,11]222.1.3列表元素的删除代码编写好后必须要经过反复测试,不能满足于几次测试结果正确。x=[1,2,1,2,1,2,1,2,1]foriinx:ifi==1:x.remove(i)x[2,2,2,2]x=[1,2,1,2,1,1,1]foriinx:ifi==1:x.remove(i)x[2,2,1]同样的代码,仅仅是所处理的数据发生了一点变化,然而当循环结束后却发现并没有把所有的“1”都删除,只是删除了一部分。思考问题的原因。232.1.3列表元素的删除在删除列表元素时,Python会自动对列表内存进行收缩并移动列表元素以保证所有元素之间没有空隙,增加列表元素时也会自动扩展内存并对元素进行移动以保证元素之间没有空隙。每当插入或删除一个元素之后,该元素位置后面所有元素的索引就都改变了。正确的代码:x=[1,2,1,2,1,1,1]foriinx[::]:#切片,相当ifi==1:#于创建了一个副本x.remove(i)或者:x=[1,2,1,2,1,1,1]foriinrange(len(x)-1,-1,-1):ifx[i]==1:delx[i]242.1.4列表元素访问与计数使用下标直接访问列表元素,如果指定下标不存在,则抛出异常。aList=[3,4,5,5.5,7,9,11,13,15,17]
本文标题:第2章-Python序列(Python程序设计董付国清华大学出版社教材配套精排版)
链接地址:https://www.777doc.com/doc-4274701 .html