《《Python序列》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《Python序列》PPT课件.ppt(60页珍藏版)》请在三一办公上搜索。
1、第2章 Python序列,主 要 内 容,列表元组字典,2,概 述,序列是Python中经常用到的数据存储方式,是按某顺序排列的数据。Python中常用的序列结构有列表、元组、字典、字符串等等。列表、元组、字符串等序列均支持双向索引第一个元素下标为0,第二个元素下标为1,以此类推;最后一个元素下标为-1,倒数第二个元素下标为-2,以此类推。,3,2.1 列表,列表的创建和删除列表元素的增加列表元素的删除列表元素访问与计数成员资格判断切片操作列表排序用于序列操作的常用内置函数,4,2.1 列表,列表是Python中内置可变序列,是元素的有序集合,列表中每一个数据称为元素,列表的所有元素放在一对中
2、括号“”和“”中,并使用逗号分隔开;列表中的各数据的类型可以不同,可以分别为整数、实数、字符串等基本类型,甚至是列表、元素、字典、集合以及其他自定义类型的对象例:10,20,30,40crunchy frog,ram bladder,lark vomitspam,2.0,5,10,20file1,200,7,file2,260,9,5,6,2.1 列表,2.1.1 列表创建与删除,用“=”创建列表,“=”赋值的同时创建 alist=a,b,mpilgrim,z,example alist=#创建空列表用list()函数将元组、range对象、字符串或其他类型的可迭代对象类型的数据转换为列表。例
3、如:alist=list(3,5,7,9,11)#圆括号表示元组 alist3,5,7,9,11 list(range(1,10,2)#该range返回 1,3,5,7,9 list(hello world)h,e,l,l,o,w,o,r,l,d x=list()#创建空列表 x,7,2.1.1 列表创建与删除,内置函数range(),语法为range(start,stop,step),第一个参数表示起始值(默认为0)第二个参数表示终止值,结果中不包括这个值第三个参数表示步长(默认为1),该函数在Python 3.x中返回一个range可迭代对象,在Python 2.x中返回一个包含若干整数的
4、列表。list(range(10)0,1,2,3,4,5,6,7,8,9 list(range(3,10,2)3,5,7,9列表推导式*(本课程不要求)是一种生成符合特定要求列表的方式。,8,2.1.1 列表创建与删除,del命令删除整个列表,如果列表对象所指向的值不再有其他对象指向,Python将同时删除该值。alist=a,b,mpilgrim,z,example del alist alistTraceback(most recent call last):File,line 1,in alistNameError:name alist is not defined,9,2.1.2 列表
5、元素的增加,(1)“+”运算符来实现将元素添加到列表中的功能。不是真的为列表添加元素,而是创建一个新列表将原列表中的元素和新元素依次复制到新列表的内存空间涉及大量元素的复制,该操作速度较慢,在涉及大量元素添加时不建议使用该方法。aList=3,4,5 bList=aList+7 aList3,4,5 bList3,4,5,7,10,2.1.2 列表元素的增加,(2)append()方法,修改原列表,在列表尾部添加元素,速度较快,例如:aList.append(9)#设aList为3,4,5,7 aList3,4,5,7,9比较“+”和append()这两种方法的速度差异,分别生成0,1,2,9
6、999:import timeresult=start=time.time()#time模块的time()函数返回当前时间for i in range(10000):result=result+iprint(len(result),time.time()-start)result=start=time.time()for i in range(10000):result.append(i)print(len(result),time.time()-start)打印结果:10000,0.003000020980834961,11,2.1.2 列表元素的增加,Python采用的是基于值的自动内存管
7、理方式,当为对象修改值时,并不是真的直接修改变量的值,而是使变量指向新的值。,12,例:a=5print(id(a)#函数id(a)获取a的内存地址a=6print(id(a)b=5print(id(b)打印结果:147126536014712653921471265360,例:a=1,2,3print(id(a)a=1,2print(id(a)b=1,2,3print(id(b)打印结果:红色地址不是每次执行都相同,2.1.2 列表元素的增加,对于列表、集合、字典等可变序列类型而言,情况稍微复杂一些。以列表为例:列表中包含的是元素值的引用,而不是直接包含元素值。通过下标来修改序列中元素的值或
8、通过可变序列对象自身提供的方法来增加、删除和修改元素时,列表在内存中的起始地址是不变的,仅仅是被改变值的元素地址发生变化。,13,a=1,2,4 b=1,2,3 a=bFalse id(a)=id(b)False id(a0)=id(b0)True a=1,2,3 id(a)25289752 a.append(4)id(a)25289752 a.remove(3)#删除a中的第一个3 a1,2,4 id(a)25289752 a0=5 a5,2,4 id(a)25289752,2.1.2 列表元素的增加,(3)使用列表对象的extend()方法可以将另一个迭代对象的所有元素添加至该列表对象尾部
9、,并不改变其内存首地址。a.extend(7,8,9)#设a原为5,2,4 a5,2,4,7,8,9 id(a)25289752 a.extend(11,13)a5,2,4,7,8,9,11,13 a.extend(15,17)a5,2,4,7,8,9,11,13,15,17 id(a)25289752,14,2.1.2 列表元素的增加,(4)使用列表对象的insert()方法将元素添加至列表的指定位置。a.insert(3,6)a5,2,4,6,7,8,9,11,13,15,17insert()方法会涉及到插入位置之后所有元素的移动,这会影响处理速度,尽量从列表尾部进行元素的增加操作,如使用
10、append(),15,2.1.2 列表元素的增加,比较append和insert:import timedef Insert():#定义函数Insert()a=for i in range(10000):a.insert(0,i)def Append():a=for i in range(10000):a.append(i)start=time.time()for i in range(10):Insert()print(Insert:,time.time()-start),16,start=time.time()for i in range(10):Append()print(Append
11、:,time.time()-start)运行结果如下:Insert:0.578000068665Append:0.0309998989105,2.1.2 列表元素的增加,(5)使用乘法扩展列表对象,将列表与整数相乘,生成一个新列表,新列表是原列表中元素的重复。aList=3,5,7 bList=aList id(aList)57091464 id(bList)57091464 aList=aList*3 aList3,5,7,3,5,7,3,5,7 bList3,5,7 id(aList)57092680 id(bList)57091464,17,注意:使用“*”运算符将包含列表的列表重复并创
12、建新列表时,并不创建元素的复制,而是创建已有对象的引用。因此修改其中一个值时,相应的引用也会被修改:x=None*2*3 xNone,None,None,None,None,None x00=5 x5,None,5,None,5,None x=1,2,3*3 x00=10 x10,2,3,10,2,3,10,2,3,2.1.3 列表元素的删除,(1)使用del命令删除列表中的指定位置上的元素。del命令也可以直接删除整个列表。aList=3,5,7,9,11 del aList1 aList3,7,9,11 del aList aListTraceback(most recent call l
13、ast):File,line 1,in aListNameError:name aList is not defined,18,2.1.3 列表元素的删除,(2)使用列表的pop()方法删除并返回指定(默认为最后一个)位置上的元素,如果给定的索引超出了列表范围则抛出异常。a_list=3,5,7,9,11 a_list.pop()#列表尾部操作,速度快11 a_list3,5,7,9 a_list.pop(1)#非列表尾部操作,速度慢5 a_list3,7,9,19,2.1.3 列表元素的删除,(3)使用列表对象的remove()方法删除首次出现的指定元素,如果列表中不存在要删除的元素,则抛出
14、异常。a_list=3,5,7,9,7,11 a_list.remove(7)a_list3,5,9,7,11问:要删除列表中所有的7,如何写代码?,20,2.1.4 列表元素访问与计数,使用下标直接访问列表元素,指定下标不存在则抛出异常 aList3#读取6 aList3=5.5#赋值 aList3,4,5,5.5,7,9,11,13,15,17 aList15Traceback(most recent call last):File,line 1,in aList15IndexError:list index out of range,21,2.1.4 列表元素访问与计数,使用列表对象的i
15、ndex方法获取指定元素首次出现的下标,不存在指定元素则抛出异常 aList3,4,5,5.5,7,9,11,13,15,17 aList.index(7)4 aList.index(100)Traceback(most recent call last):File,line 1,in aList.index(100)ValueError:100 is not in list,22,2.1.4 列表元素访问与计数,列表对象的count方法统计指定元素在列表中出现的次数 aList=3,4,5,5.5,7,9,11,13,5,17 aList.count(7)1 aList.count(0)0
16、aList.count(5)2,23,2.1.5 成员资格判断,如果需要判断列表中是否存在指定的值,可以使用“in”关键字来判断一个值是否存在于列表中,返回结果为“True”或“False”。,24,aList3,4,5,5.5,7,9,11,13,15,17 3 in aListTrue 18 in aListFalse bList=1,2,3 3 in bListFalse 3 not in bListTrue 3 in bListTrue aList=3,5,7,9,11 bList=a,b,c,d(3,a)in zip(aList,bList)True#zip(列表1,列表2,):将多
17、个列表对应位置元素组合为元组,返回包含这些元组的列表 for a,b in zip(aList,bList):print(a,b)3 a5 b7 c9 d,2.1.6 切片操作,切片是Python序列的重要操作之一,适用于列表、元组、字符串、range对象等类型。切片使用“数字-开始位置:数字-截止(但不包含)位置:数字-切片的步长(默认为1)”来完成,当步长省略时可以顺便省略最后一个冒号。使用切片可以:截取列表中的任何部分,得到一个新列表。修改、增加、删除列表中部分元素切片操作返回一个新的列表。切片操作不会因为下标越界而抛出异常,而是在列表尾部截断或者返回一个空列表。,25,2.1.6 切片
18、操作,aList=3,4,5,6,7,9,11,13,15,17 aList:3,4,5,6,7,9,11,13,15,17 aList:-117,15,13,11,9,7,6,5,4,3 aList:23,5,7,11,15 aList1:24,6,9,13,17,26,aList3:6,7,9,11,13,15,17 aList3:66,7,9 aList3:6:16,7,9 aList0:100:1#超出范围3,4,5,6,7,9,11,13,15,17 aList100:,切片获取列表的部分:,2.1.6 切片操作,切片原地修改列表内容,27,aList=3,5,7 aListlen(
19、aList):aListlen(aList):=9 aList3,5,7,9 aList:3=1,2,3 aList1,2,3,9,aList:3=aList9 aList=list(range(10)aList0,1,2,3,4,5,6,7,8,9 aList:2=0*(len(aList)/2)aList0,1,0,3,0,5,0,7,0,9,2.1.6 切片操作,使用del与切片结合来删除列表元素 aList=3,5,7,9,11 del aList:3 aList9,11,28,2.1.6 切片操作,切片返回的是列表元素的浅复制,29,aList=3,5,7 bList=aList#深
20、复制,两列表数据在同一内存地址#改其中一个其他均一起改 bList3,5,7 bList1=8 aList3,8,7 aList=bListTrue aList is bListTrue id(aList)19061816 id(bList)#地址相同19061816,aList=3,5,7 bList=aList:#浅复制,不同地址 aList=bList#列表元素相同True aList is bListFalse id(aList)=id(bList)#地址不同False bList1=8 bList3,8,7 aList3,5,7 aList=bListFalse aList is b
21、ListFalse id(aList)19061816 id(bList)11656168,2.1.7 列表排序,使用列表对象的sort方法进行原地排序 aList=3,4,5,6,7,9,11,13,15,17 import random random.shuffle(aList)#将序列的所有元素随机排序 aList3,4,15,11,9,17,13,6,7,5 aList.sort()aList3,4,5,6,7,9,11,13,15,17 aList.sort(reverse=True)aList17,15,13,11,9,7,6,5,4,3 aList.sort(key=lambda
22、 x:len(str(x)#lambda x:len(str(x)是以x为传入参数的匿名函数 aList9,7,6,5,4,3,17,15,13,11#按字符串长度排,30,2.1.7 列表排序,使用内置函数sorted对列表进行排序并返回新列表 aList9,7,6,5,4,3,17,15,13,11 sorted(aList)3,4,5,6,7,9,11,13,15,17 sorted(aList,reverse=True)17,15,13,11,9,7,6,5,4,3使用列表对象的reverse方法将元素原地逆序 aList=3,4,5,6,7,9,11,13,15,17 aList.r
23、everse()aList17,15,13,11,9,7,6,5,4,3,31,2.1.7 列表排序,使用内置函数reversed方法对列表元素进行逆序排列并返回迭代对象 aList=3,4,5,6,7,9,11,13,15,17 newIteration=reversed(aList)newIteration list(newIteration)17,15,13,11,9,7,6,5,4,3 for i in newIteration:print(i)#(无输出,迭代对象已遍历结束,需重新创建迭代对象)newIteration=reversed(aList)for i in newItera
24、tion:print(i)17 15 133,32,2.1.8 用于序列操作的常用内置函数,在Python 3.x中使用关系运算符来比较数值或序列的大小,也可以使用对象的“_le_()”及其相关方法。,33,a=1,2 b=1,2,3(ab)-(a a._le_(b)True a._gt_(b)False,a=1,2 b=1,2,3 a abFalse(ab)=0True(ab)=1True,2.1.8 用于序列操作的常用内置函数,len(列表):返回列表中的元素个数,同样适用于元组、字典、字符串等等。max(列表)、min(列表):返回列表中的最大或最小元素,同样适用于元组、range。su
25、m(列表):对数值型列表的元素进行求和运算,对非数值型列表运算则出错,同样适用于元组、range。,34,2.1.8 用于序列操作的常用内置函数,zip(列表1,列表2,):将多个列表对应位置元素组合为元组,返回包含这些元组的列表。a=1,2,3 b=4,5,6 c=zip(a,b)c c=list(c)c(1,4),(2,5),(3,6),35,2.1.8 用于序列操作的常用内置函数,enumerate(列表):枚举列表元素,返回枚举对象,其每个元素为包含下标和值的元组。该函数对元组、字符串同样有效。c=(1,4),(2,5),(3,6)for item in enumerate(c):pr
26、int(item)(0,(1,4)(1,(2,5)(2,(3,6),36,上机作业02,编程:尝试输入一组数,找出其中被7除余5,被5除余3,被3除余2的所有数。P80第2.5题列表lst=2,3,7,1,6,8,10,请对列表按照升序、降序分别排序,分别使用列表方法sort()和内置函数sorted().,37,2.2 元 组,元组创建与删除元组与列表的区别序列解包,38,2.2 元 组,元组和列表类似,但属于不可变序列,元组一旦创建,用任何方法都不可以修改其元素。元组的定义方式和列表相同,但定义时所有元素是放在一对圆括号“(”和“)”中,而不是方括号中。,39,2.2.1 元组创建与删除,
27、使用“=”将一个元组赋值给变量atuple=(a,)#元组只有一个元素时必须有一个“,”atuple(a)atuple=(a,b,mpilgrim,z,example)atuple(a,b,mpilgrim,z,example)a=3 a3 a=3,#“,”不能少 a(3,)x=()#空元组 x(),40,2.2.1 元组创建与删除,使用tuple函数将其他序列转换为元组 print(tuple(abcdefg)(a,b,c,d,e,f,g)aList=-1,-4,6,7.5,-2.3,9,-11 tuple(aList)(-1,-4,6,7.5,-2.3,9,-11)s=tuple()#空元
28、组 s()使用del删除元组,不能删除元组元素,41,2.2.2 元组与列表的区别,元组中的数据一旦定义就不可更改。元组没有append()、extend()和insert()等方法,无法向元组中添加元素;元组没有remove()或pop()方法,也无法对元组元素进行del操作,不能从元组中删除元素。元组的速度比列表更快元组对不需要改变的数据进行“写保护”将使得代码更加安全。一些元组可用作字典键(特别是包含字符串、数值和其它元组这样的不可变数据的元组)。列表永远不能当做字典键使用,因为列表不是不可变的。内建的tuple()函数接受一个列表参数,并返回一个包含同样元素的元组,而list()函数接
29、受一个元组参数并返回一个列表。,42,2.2.3 序列解包,可以使用序列解包功能对多个变量同时赋值 v_tuple=(False,3.5,exp)(x,y,z)=v_tuple#元组对元组赋值序列解包对于列表和字典同样有效 a=1,2,3 b,c,d=a s=a:1,b:2,c:3#a:1中a为键,1为值,其余类推。b,c,d=s#缺省将键赋给对应元素,否则应写s.value ba cc db,43,2.2.3 序列解包,keys=a,b,c,dvalues=1,2,3,4for k,v in zip(keys,values):print(k,v)执行:a 1b 2c 3d 4,44,aLis
30、t=1,2,3bList=4,5,6cList=7,8,9dList=list(zip(aList,bList,cList)for index,value in enumerate(dList):print(index,:,value)执行:0:(1,4,7)1:(2,5,8)2:(3,6,9),2.3 字 典,字典创建与删除字典元素的读取字典元素的添加与修改字典应用案例有序字典,45,2.3 字 典,字典是键值对的无序可变集合。desk:书桌,book:书 定义字典时,每个元素的键和值用冒号分隔,元素之间用逗号分隔,所有元素放在一对大括号“”和“”中。字典中的每个元素包含两部分:键和值,向字
31、典添加一个键的同时,必须为该键增添一个值。字典中的键可以为任意不可变数据,比如整数、实数、复数、字符串、元组等等。字典中的键不允许重复。globals()返回包含当前作用域内所有全局变量和值的字典locals()返回包含当前作用域内所有局部变量和值的字典,46,2.3.1 字典创建与删除,使用“=”将字典赋值给变量 a_dict=server:db.diveintopython3.org,database:mysql a_dictdatabase:mysql,server:db.diveintopython3.org x=#空字典 x,47,2.3.1 字典创建与删除,dict利用已有数据创建
32、字典:keys=a,b,c,d values=1,2,3,4 dictionary=dict(zip(keys,values)print(dictionary)a:1,c:3,b:2,d:4 x=dict()#空字典 x使用dict根据给定的键、值创建字典 d=dict(name=Dong,age=37)dage:37,name:Dong,48,2.3.1 字典创建与删除,以给定内容为键-值为空创建字典 adict=dict.fromkeys(name,age,sex)adictage:None,name:None,sex:None使用del删除整个字典 del adict adictTrac
33、eback(most recent call last):File,line 1,in adictNameError:name adict is not defined,49,2.3.2 字典元素的读取,以键作为下标可以读取字典元素,若键不存在则抛出异常 aDict=name:Dong,sex:male,age:37 aDictnameDong aDicttelTraceback(most recent call last):File,line 1,in aDicttelKeyError:tel,50,2.3.2 字典元素的读取,使用字典对象的get方法获取指定键对应的值,并且可以在键不存在的
34、时候返回指定值。print(aDict.get(address)None print(aDict.get(address,SDIBT)SDIBT aDictscore=aDict.get(score,)#由于没有score键,将增加此键,对应值成为空列表 aDictscore.append(98)aDictscore.append(97)aDictage:37,score:98,97,name:Dong,sex:male,51,2.3.2 字典元素的读取,字典对象的items()方法返回字典的键、值元组对列表字典对象的keys()方法返回字典的键列表字典对象的values()方法返回字典的值列
35、表,52,aDict=name:Dong,sex:male,age:37 for item in aDict.items():print(item)(age,37)(name,Dong)(sex,male)for key,value in aDict.items():print(key,value)age 37name Dongsex male for key in aDict:print(key)agenamesex aDict.keys()dict_keys(age,name,sex)aDict.values()dict_values(37,Dong,male),2.3.3 字典元素的增改
36、删,当以指定键为下标为字典赋值时,若键存在,则可以修改该键的值;若不存在,则表示添加一个键、值对。aDictage=38 aDictage:38,name:Dong,sex:male aDictaddress=SDIBT aDictage:38,address:SDIBT,name:Dong,sex:male,53,2.3.3 字典元素的增改删,使用字典对象的update方法将另一字典的键、值对添加到当前字典对象,如果原字典有相同键则修改相应值 aDict=age:37,score:98,97,name:Dong,sex:male aDict.items()(age,37),(score,98
37、,97),(name,Dong),(sex,male)aDict.update(age:38,a:a,b:b)aDicta:a,score:98,97,name:Dong,age:38,b:b,sex:male,54,2.3.3 字典元素的增改删,使用del删除字典中指定键的元素aDict=age:37,score:98,97,name:Dong,sex:maledel aDictageaDictsex:male,name:Dong,score:98,97使用字典对象的clear()方法来删除字典中所有元素 aDict.clear()aDict使用字典对象的pop()方法删除并返回指定键的元素
38、 aDict=age:37,score:98,97,name:Dong,sex:male aDict.pop(age)37 aDictsex:male,name:Dong,score:98,97使用字典对象的popitem方法-随机-删除并返回字典中的一个元素 aDict.popitem()(sex,male)aDictname:Dong,score:98,97,55,*字典应用案例,下面的代码首先生成包含1000个随机字符的字符串,然后统计每个字符的出现次数。*import string import random x=string.ascii_letters+string.digits+s
39、tring.punctuation xabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%?_|y=random.choice(x)for i in range(1000)#random.choice()方法返回列表,元组或字符串中的随机项 z=.join(y)d=dict()for ch in z:dch=d.get(ch,0)+1,56,*字典应用案例,也可以使用collections模块的defaultdict类来实现该功能。*import string import random x=string.asci
40、i_letters+string.digits+string.punctuation y=random.choice(x)for i in range(1000)z=.join(y)from collections import defaultdict frequences=defaultdict(int)frequencesdefaultdict(,)for item in z:frequencesitem+=1 frequences.items(),57,*字典应用案例,使用collections模块的Counter类可以快速实现这个功能,并且能够其他需要,例如查找出现次数最多的元素。下面
41、的代码演示了Counter类的用法:*from collections import Counter frequences=Counter(z)frequences.items()frequences.most_common(1)(A,22)frequences.most_common(3)(A,22),(;,18),(,17),58,*有序字典,Python内置字典是无序的。如果需要可以记住元素插入顺序的字典,可以使用collections.OrderedDict。例如下面的代码:x=dict()#无序字典 xa=3 xb=5 xc=8 xb:5,c:8,a:3 import collections x=collections.OrderedDict()#有序字典 xa=3 xb=5 xc=8 xOrderedDict(a,3),(b,5),(c,8),59,作 业,1、字典d=,“张三”:76,“李四”:45,“王五”:83,“赵六”:66,写出下列操作的代码:a)向字典中添加键值对“钱七”:90 b)修改“李四”的值为60 c)删除“赵六”对应的键值对2、P80习题2.5 统计整数的个数3、P80习题2.9,60,