python程序设计及上机实验教程第5章Python序列结构_第1页
python程序设计及上机实验教程第5章Python序列结构_第2页
python程序设计及上机实验教程第5章Python序列结构_第3页
python程序设计及上机实验教程第5章Python序列结构_第4页
python程序设计及上机实验教程第5章Python序列结构_第5页
已阅读5页,还剩162页未读 继续免费阅读

下载本文档

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

文档简介

程序设计及上机实验PythonPython序列结构第5章5.1序列概述5.2列表5.3元组5.4字典5.5集合5.6案例实战5.7课后习题列表的创建、删除、拷贝、访问、切片、比较、

成员测试操作元组的创建、删除、下标访问、切片等基本操作字典的创建、删除、元素访问、元素修改、

元素删除、元素排序等基本操作集合的创建、删除、元素的增加、元素的删除、

集合的运算等基本操作本章重点列表的创建、删除、访问、排序、

切片、比较、成员测试字典的创建、删除和基本操作本章难点序列(sequence)是一种用来存放多个值的数据类型。在Python中,序列类型包括字符串、列表、元组、字典和集合。序列中对象类型可以相同也可以不同。序列按照其中的元素是否可变分为可变序列和不可变序列,按照元素是否有序分为有序序列和无序序列,具体参见表5-1。

序列概述5.1表5-1

序列概述5.1列表5.2列表是最常用的Python数据类型,列表的数据项不需要类型相同。在形式上,只要把逗号分隔的不同数据项使用方括号“[]”括起来就可以构成一个列表。在Python中,一个列表中的数据项可以各不相同,也可以同时为整数、实数、字符串等基本类型,甚至是列表、元组、字典、集合或其他自定义类型。列表是Python内置的有序、可变序列。当列表元素增加或删除时,列表对象自动进行扩展或收缩内存,保证元素之间没有空隙。列表5.25.2.1列表的创建和删除Python提供了多种创建列表的方法,包括使用赋值运算符直接创建列表、创建空列表、创建数值列表等。1.使用赋值运算符直接创建列表同其他类型的Python变量一样,在创建列表时,可以直接使用赋值运算符“=”将列表赋值。将列表元素放置在一对方括号[]内,以逗号分隔,将这个列表赋值给变量,即可创建列表。例5-1使用赋值运算符给不同的列表变量赋值student=["张涛","男",2010,10]score=[87,85,78,90]words=["自强不息","独立自强","奋发图强"]saling_books=['hadoop','年度畅销书',[2020,12000]]print(student)print(score)print(words)print(saling_books)列表5.2=========RESTART:J:/5-1.py========['张涛','男',2010,10][87,85,78,90]['自强不息','独立自强','奋发图强']['hadoop','年度畅销书',[2020,12000]]运行结果如下:列表5.2=========RESTART:J:/5-1.py========['张涛','男',2010,10][87,85,78,90]['自强不息','独立自强','奋发图强']['hadoop','年度畅销书',[2020,12000]]运行结果如下:列表5.22.创建空列表在Python中创建新的空列表的方法如下:empty_list=[]student=[]3.创建数值列表Python中的数值列表很常用,用于存储数值集合。Python提供了list()函数,它可以将range对象、字符串、元组或其他可迭代类型的数据转换为列表。例5-2创建一个包含1到5的整数列表num_list=list(range(1,6))print(num_list)列表5.2=========RESTART:J:/5-2.py========[1,2,3,4,5]运行结果为:列表5.2例5-3创建一个包含1到10中的奇数的列表num_list=list(range(1,11,2))print(num_list)运行结果为:=========RESTART:J:/5-3.py========[1,3,5,7,9]列表5.24.列表的删除当列表不再使用时,可以使用del命令删除整个列表,如果列表对象所指向的值不再有其他对象指向,Python将同时删除该值。列表5.2例5-5创建一个包含1到100中的偶数的列表,输出该列表后删除该列表。num_list=list(range(2,101,2))print(num_list)delnum_list运行结果为:=========RESTART:J:/5-5.py========[2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,58,60,62,64,66,68,70,72,74,76,78,80,82,84,86,88,90,92,94,96,98,100]列表5.25.2.2列表的赋值、浅拷贝和深拷贝1.列表的赋值在Python中,对象赋值实际上是拷贝对象的引用。当创建一个对象,然后把它赋给另一个变量的时候,Python并没有拷贝这个对象,而只是拷贝了这个对象的引用。如果原始列表改变,被赋值的对象也会做相同的改变。例5-6列表赋值讲解>>>a=[1,2,[3,4],5]>>>b=a>>>a[1,2,[3,4],5]>>>b[1,2,[3,4],5]>>>id(a)36761768>>>id(b)36761768列表5.2以上例子的赋值内存如图所示。接下来我们来改变a的值去观察b的值,改变b的值观察a的值的变化,示例如下:>>>a.append(8)>>>a[1,2,[3,4],5,8]>>>b[1,2,[3,4],5,8]>>>b.append(9)>>>b[1,2,[3,4],5,8,9]>>>a[1,2,[3,4],5,8,9]列表5.2从输出结果来看,无论是a还是b改变,另外一个变量都会随之改变。Python中的赋值语句不复制对象,它们在目标和对象之间创建绑定,列表是一个可变序列,在操作过程中,有时需要一个副本,以便更改副本而不更改原列表对象,这时我们就需要拷贝操作。列表5.22.列表的浅拷贝copy模块是Python的内建模块,通过该模块可以完成列表的浅拷贝和深拷贝。使用该模块时,使用importcopy即可完成内建模块的导入。浅拷贝,拷贝的是父对象,不会拷贝到内部的子对象。浅拷贝会创建新对象,其内容是原对象的引用,之所以称为浅拷贝,是因为它仅仅只拷贝了一层。如果原列表中只包含整数、实数、复数等基本类型或元组、字符串这样的不可变类型的数据,一般是没有问题的(不会影响)。但是如果原列表中包含列表、字典之类的可变数据类型,那么修改原列表或新列表中任何一个都会影响另外一个(针对使用序列提供的方法)。例5-7浅拷贝应用示例>>>importcopy#导入内建模块copy>>>a=[1,2,[3,4],5]#创建一个列表a>>>b=copy.copy(a)#浅拷贝>>>a[1,2,[3,4],5]>>>b[1,2,[3,4],5]>>>id(a)47178896>>>id(b)47141632列表5.2以上例子的内存浅拷贝如图所示。接下来我们更改a的数据,示例如下:>>>a.append(6)#在列表a中增加元素6>>>a[1,2,[3,4],5,6]#a列表的值已发送改变>>>b[1,2,[3,4],5]#b列表中的值没有发生改变列表5.2从输出结果来看,可以发现浅层的数据更改(第一层)为[1,2,[3,4],5,6],但b的第一层数据没有发生变化,依然为[1,2,[3,4],5]。接下来进行子对象数据(深层数据)的更改,示例如下:列表5.2>>>a[2].append(7)#改变a列表的第二层数据>>>a[1,2,[3,4,7],5,6]>>>b[1,2,[3,4,7],5]从输出结果来看,可以发现b发生了改变,b的第二层数据由原来的[3,4]变为[3,4,7]。由此我们可以看出,浅拷贝只能让副本的第一层数据独立,副本第二层以后的数据依然于原列表关联,如果想让副本的每一层数据都独立,那么就需要深拷贝来完成。列表5.23.深拷贝之所以称为深拷贝,是因为它可以拷贝父对象及其子对象两层。原始对象的改变不会造成深拷贝里任何子元素的改变。使用copy模块中的deepcopy()函数进行深拷贝。例5-8深拷贝示例>>>importcopy>>>a=[1,2,[3,4],5]>>>b=copy.deepcopy(a)>>>a[1,2,[3,4],5]>>>b[1,2,[3,4],5]>>>id(a)47160416>>>id(b)47179336>>>aisbFalse列表5.2接下来我们更改a的数据,示例如下:>>>a.append(6)>>>a[1,2,[3,4],5,6]>>>b[1,2,[3,4],5]列表5.2列表5.2从输出结果来看,可以发现浅层的数据更改(第一层),但是b没有发生变化。接下来进行子对象数据(深层数据)更改,示例如下:>>>a[2].append(7)>>>a[1,2,[3,4,7],5,6]>>>b[1,2,[3,4],5]可以发现b也不会发生改变,所有深拷贝可以让副本完全独立与原列表。列表5.25.2.3访问列表元素与字符串的访问一样,列表的访问也是通过下标索引来完成的,分为从正向访问和反向访问。正向访问即从列表头部开始访问,索引值从0开始,第二个索引为1,依次类推。图5-4列表的索引列表5.2反向访问即从列表尾部开始,最后一个元素的索引为-1,往前一位为-2,依次类推。图5-5列表的反向索引列表5.2例5-9

列表的访问示例>>>a=[1,2,3,4,5,6,"abcd"]>>>a[0]1>>>a[5]6>>>a[6]'abcd'>>>a[-1]'abcd'>>>a[-7]1>>>a[6][0]#使用二级索引‘a’列表可以使用for循环实现列表的遍历。列表5.2例5-10创建购物清单列表:牛奶,面包,苹果,香蕉,薯条,可乐,果汁,并用for循环来遍历分析:for循环遍历列表既可以通过直接获取元素遍历,也可以通过下标来遍历,下面我们将分别用两种方法来演示。列表5.2shopping=['牛奶','面包','苹果','香蕉','薯条','可乐','果汁’] #方法一,直接访问元素来遍历forelementinshopping:print(element,end="") #方法二,通过下标来遍历print("\n")lens_shopping=len(shopping) #获取购物清单列表的长度,为下一步通过下标索引做准备foriinrange(lens_shopping):print(shopping[i],end=",")=========RESTART:J:/5-10.py========牛奶面包苹果香蕉薯条可乐果汁牛奶,面包,苹果,香蕉,薯条,可乐,果汁,5.21.列表元素的添加列表元素的添加可以使用函数append()、extend()和insert(),或者使用“+”“*”运算符。除了“+”运算符外,其他几个方法都属于原地操作。通过下标来修改序列中元素的值或通过可变序列对象自身提供的方法来增加和删除元素时,序列对象在内存中的起始地址是不变的,仅仅是被改变值的元素地址发生变化,这就是所谓的“原地操作”。列表5.2.4添加、删除、修改列表元素5.2(1)append()方法append()方法是列表对象的一个内置方法,主要作用是在列表尾部追加一个元素。通过append()方法在当前列表尾部追加元素是属于原地修改列表,速度较快。列表5.2例5-11append方法示例>>>aList=[3,4,5,6]>>>aList.append(7)>>>aList[3,4,5,6,7]列表5.2(2)extend()方法extend()方法是列表对象的一个内置方法,主要作用是在列表尾部追加一系列元素。使用列表对象的extend()方法可以将另一个迭代对象的所有元素添加至该列表对象尾部。通过extend()方法来增加列表元素也不改变其内存首地址,属于原地操作。列表5.2例5-12extend方法示例>>>alist=[1,2,3,4]>>alist.extend([5,6])>>>alist[1,2,3,4,5,6]列表5.2(3)insert()方法使用列表对象的insert(index,x)方法可以将元素添加至列表的指定位置。列表的insert()方法可以在列表的任意位置插入元素,但由于列表的自动内存管理功能,insert()方法会引起插入位置之后所有元素的移动,这会影响处理速度。列表5.2例5-13

insert方法示例>>>alist.insert(3,6)#在下标为3的位置插入元素6>>>alist[1,2,3,6,4,5,6]列表5.2(4)使用“+”运算符可以使用“+”运算符来把元素添加到列表中。列表5.2例5-14

“+”运算符添加元素示例>>>alist=[1,2,3]>>>id(alist) #查看当前列表alist的id46716808>>>alist=alist+[4,5] #查看使用“+”运算符后列表alist的id>>>id(alist) 46689896#id值发生变化>>>alist [1,2,3,4,5]通过“+”运算符来增加列表元素,实际上是创建了一个新列表,并将原列表中的元素和新元素依次复制到新列表的内存空间。列表5.2(5)使用“*”运算符Python提供了“*”运算符来扩展列表对象,将列表与整数相乘,生成一个新列表,新列表是原列表中元素的重复。列表5.2例5-14

“*”运算符添加元素示例>>>alist=[1,2,3]>>>alist=alist*3>>>alist[1,2,3,1,2,3,1,2,3]列表5.2>>>blist=[[1,2,3]]*3>>>blist[[1,2,3],[1,2,3],[1,2,3]]>>>blist[0][0]=4>>>blist[[4,2,3],[4,2,3],[4,2,3]]当使用“*”运算符将包含列表的列表重复并创建新列表时,并不是复制子列表的值,而是复制已有元素的引用。因此,当修改其中一个值时,相应的引用也会被修改,例如:列表5.22.列表元素的删除列表元素的删除可以使用函数pop()、remove,或者使用Python保留字del。(1)使用del语句删除del语句既可以删除列表指定位置的元素,也可以删除整个列表。列表5.2例5-16del删除示例>>>alist=[1,2,3]>>>delalist[0]>>>alist[2,3]>>>delalist>>>alistTraceback(mostrecentcalllast):File"<pyshell#8>",line1,in<module>alistNameError:name'alist'isnotdefined列表5.2(2)使用pop()方法删除元素pop()方法是列表对象的内置函数,使用列表的pop()方法删除并返回指定位置(默认为最后一个)上的元素,如果给定的下标超出了列表的范围则抛出异。列表5.2例5-17pop()删除示例>>>alist=list(1,2,3,4,5)>>>alist[1,2,3,4,5]>>>alist.pop()5>>>alist[1,2,3,4]>>>alistpop(2)#删除索引为2的元素,并返回该值3>>alist[1,2,4]>>>alist.pop(5)#下标5超出列表索引范围,报错 Traceback(mostrecentcalllast):File"<pyshell#50>",line1,in<module>alist.pop(5)IndexError:popindexoutofrange列表5.2(3)使用remove()方法删除元素remove()方法是列表对象的内置函数,使用列表对象的remove()方法删除首次出现的指定元素,如果列表中不存在要删除元素,则抛出异常。列表5.2例5-18remove()删除示例>>>alist=list("development")>>>alist['d','e','v','e','l','o','p','m','e','n','t']>>>alist.remove("e")>>>alist['d','v','e','l','o','p','m','e','n','t']>>>alist.remove("h")Traceback(mostrecentcalllast):File"<pyshell#14>",line1,in<module>alist.remove("h")ValueError:list.remove(x):xnotinlist列表5.2例5-19运行下面的程序,可以发现当循环结束后并没有把所有的“1”都删除,只是删除了部分。x=[1,2,1,2,1,1]foriinx:ifi==1:x.remove(1)print(x)运行结果为:[2,2,1]为什么会发生这种现象?当删除列表元素时,Python会自动对列表内存进行收缩并移动列表元素,以保证所元素之间没有空隙,增加列表元素时也会自动扩展内存并对元素进行移动,以保证元素间没有空隙。每当插入或删除一个元素之后,该元素位置后面所有元素的索引就都改变了。列表5.2如何解决呢?可以改变删除元素的方向,从后向前删除。当列表收缩时,右侧元素的移位就不会造成元素索引位置变化导致的错误,见下例:x=[1,2,1,2,1,1]foriinrange(len(x)-1,-1,-1):ifx[i]==1:x.remove(1)print(x)执行结果为:[2,2]列表5.2如果想观察列表每一次的变化,可以用以下代码:x=[1,2,1,2,1,1]foriinrange(len(x)-1,-1,-1):ifx[i]==1:x.remove(1)print(x)列表5.23.列表元素的修改列表元素的修改非常简单,通过下标索引替换原来的值即可。列表5.2例5-20列表元素修改示例,创建购物清单列表:['牛奶','面包','苹果','香蕉','薯条','可乐','果汁'],修改购物清单中索引3的值,将它改成葡萄,并且打印列表。shopping=['牛奶','面包','苹果','香蕉','薯条','可乐','果汁']print(shopping)shopping[3]="葡萄"print(shopping)运行结果为:['牛奶','面包','苹果','香蕉','薯条','可乐','果汁']['牛奶','面包','苹果','葡萄','薯条','可乐','果汁']列表5.3>>>books=['hadoop','python','bigdata','python','python']>>>len(books)#获得该列表的长度5#列表的长度为5>>>print("该列表的长度为:",len(books))#交互式输出列表的长度该列表的长度为:51.统计列表的长度Python内置函数len()用于统计列表的长度,如:列表5.2.5对列表进行统计5.22.获取指定元素出现的次数列表对象的count()方法用来统计指定元素在列表中出现的次数。列表5.2>>>aList=[3,4,5,5.5,7,9,11,13,15,7]>>>aList.count(7)2例5-21获取指定元素出现次数示例列表5.23.获取指定元素首次出现的下标列表对象的index()方法用来获取指定元素首次出现的下标,语法格式如下:index(value,[start,[stop]]其中,start和stop用来指定搜索范围,start默认为0,stop默认为列表长度。如果列表对象中不存在指定元素,则会抛出异常。列表5.2>>>books=['hadoop','python','bigdata','python','python']#定义一个列表>>>position=books.index("python")#查看该列表中'python'首次出现的下标>>>print(position)1#返回首次出现'python'元素的下标为1例5-22获取指定元素首次出现的下标示例列表5.24.统计数值列表的元素和Python内置函数sum()用于统计数值列表中各个元素的和,语法格式如下:sum(alist[,start])其中,alist表示要统计的列表,start用于指定相加的参数,如果没有指定,默认值为0。列表5.2score=[85,78,90,95,68,89,85,87]total=sum(score)print("总分为:",total)例5-23定义一个列表用来存储某同学的各科考试成绩,并统计出该生的总分数。执行结果为:总分为:677列表5.2>>>score=[85,78,90,95,68,89,85,87]>>>print("最高分为:",max(score))最高分为:95>>>print("最低分为:",min(score))最低分为:685.求列表的最大值、最小值通过Python的内置函数max()、min()可以获取列表中元素的最大值和最小值,如:列表5.2列表5.2.6对列表进行排序列表对象提供了内置的sort()方法用来排序,也可以用Python内置的全局sorted()函数对列表排序产生新的列表。5.2alist.sort(key=None,reverse=False)列表5.2.6对列表进行排序1.使用列表对象的sort()方法排序使用列表对象的sort()方法对列表中的元素进行排序,排序后列表中的元素顺序将会发生改变,语法格式为:其中,alist表示要排序的列表,key参数用于指定一个函数,此函数将在每个元素比较之前被调用,例如可以设置key=str.lower来忽略字符串的大小写;reverse是一个可选参数,值为True表示降序排序,值为False表示升序排序,默认为升序排序。5.2>>>num_list=list(range(1,25))>>>num_list[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24]>>>importrandom>>>random.shuffle(num_list)#将列表随机打乱>>>num_list #输出显示打乱后的列表值[18,9,6,7,15,21,3,8,20,16,5,19,10,17,2,22,23,13,24,12,4,11,1,14]>>>num_list.sort() #对打乱后的列表进行排序>>>num_list #输出排序后的列表[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24]>>>num_list.sort(reverse=True) #降序排序>>>num_list #输出排序后的列表[24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1]列表例5-24sort()排序示例5.2>>>books=["Bigdata","Dataanalysis","DataVisualization","Datastructure","Python","C++"]>>>books.sort()#默认区分字母大小写>>>books['Bigdata','C++','DataVisualization','Dataanalysis','Datastructure','Python']>>>books.sort(key=str.lower)#不区分字母大小写>>>books['Bigdata','C++','Dataanalysis','Datastructure','DataVisualization','Python']列表当列表中的元素类型是字符串时,sort()排序规则是,先对大写字母进行排序,再对小写字母进行排序。如果在排序时不考虑字母大小写,则需要设置key=str.lower。例5-25字符串元素排序示例5.2列表2.使用Python内置的sorted()方法排序Python提供了一个内置的全局函数sorted(),可以用来对列表排序产生新的列表,原列表的元素保持不变,语法格式为:sorted(alist,key=None,reverse=False)其中,alist表示要排序的列表,key参数用于指定一个函数,此函数将在每个元素比较前调用,例如可以设置key=str.lower来忽略字符串的大小写;reverse是一个可选参数,值为True表示降序排序,值为False表示升序排序,默认为升序排序。5.2>>>score=[87,66,89,90,75]#定义一个列表>>>score_asc=sorted(score)#对该列表使用Python内置函数sorted()排序,排序后的结果存在一个新变量score_asc列表里>>>score#输出原列表score,结果为该列表没有发生改变[87,66,89,90,75]>>>score_asc#输出排序后的列表score_asc[66,75,87,89,90]>>>score_desc=sorted(score,reverse=True)#对该列表使用Python内置函数sorted()降序排序,排序后的结果存在一个新变量score_desc列表里>>>score_desc#输出排序后的列表score_desc[90,89,87,75,66]>>>score#输出原列表score,结果为该列表没有发生改变[87,66,89,90,75]列表例5-26sorted()排序示例5.2列表5.2.7列表的比较关系运算符(<、>、==、!=、<=、>=)也可以用来对列表进行比较。两个列表的比较规则如下:比较两个列表的第一个元素,如果两个元素相同,则继续比较后面两个元素;如果两个元素不同,则返回两个元素的比较结果;一直重复这个过程直到有不同元素或者比较完所有元素为止。5.2>>>list1=[1,2,3]>>>list2=[2,5,6]>>>list1>list2False>>>list1<list2True列表例5-27列表的比较示例5.2列表5.2.8成员资格判断如果需要判断列表中是否存在指定的值,可以采用四种不同的方式:in、notin、count()、index()。1.in和notin使用in操作符判断一个值是否存在于列表中,使用notin操作符判断一个值是否不在列表中。5.2>>>alist=[1,2,3]>>>a=2>>>ainalistTrue>>>4notinalistTrue列表例5-28in操作示例5.2列表2.count()函数判断一个值是否在列表中列表对象的count()函数是用来返回指定值在列表中出现的次数,如果指定的值存在,则返回大于0的数,如果返回0,则表示指定的值不存在。5.2alist=[4,5,7,8,9,2,4,5]ifalist.count(8)==0:print("8不在这个列表里")else:print("8在这个列表里")ifalist.count(3)==0:print("3不在这个列表里")else:print("3在这个列表里")执行结果为:8在这个列表里3不在这个列表里列表例5-29

count()操作示例,定义一个列表用来存储一组数据4,5,7,8,9,2,4,5;并分别判断8和3是否在该列表里,输出判断结果5.2列表3.index()函数判断一个值是否在列表中列表对象的index()函数是用来查看指定值在列表中的位置,如果列表中存在指定值,则会返回该值第一次出现的位置,否则会抛出错误,该方法并不常用。5.2列表5.2.9切片操作切片操作是访问序列中元素的一种方法,切片操作不是列表特有的,Python中的有序序列(如字符串、元组)都支持切片操作。切片的返回结果类型和切片对象类型一致,返回的是切片对象的子序列,比如对一个列表切片返回列表,对一个字符串切片返回字符串,对一个元组切片返回元组。列表切片操作使用语法“list_name[start:end:step]”返回列表list_name的一个片段。5.2列表其中,参数start表示切片的开始位置,默认为0;参数end表示切片的截止(不包含)位置,默认为列表的长度;参数step表示切片的步长,默认为1。当step为负整数时,表示反向切片。这时start位置应该在end位置的右侧,否则会返回空列表。start默认为-1,end默认为列表第1个元素前面的位置(-len(list_name)-1)。其中-1表示列表最后一个元素的位置,其他以此类推。当step为正整数时,表示正向切片;start为0时可以省略;当end为列表长度时可以省略;当step为1时可以省略,省略步长时,还可以同时省略最后一个冒号。5.2列表1.使用切片获取列表的部分元素使用切片可以返回列表中部分元素组成的新列表。切片操作不会因为下标越界而抛出异常,而是简单地在列表尾部截断或者返回一个空列表,代码具有更强的健壮性。5.2>>>numbers=[1,2,3,4,5,6,7,8]>>>a=numbers[::]#切片产生一个新列表,返回包含原列表中所有元素的新列>>>a[1,2,3,4,5,6,7,8]>>>id(numbers)#原列表的内存地址49105480>>>id(a)#新切片列表的内存地址42922376>>>numbers[:]#省略位置和步长[1,2,3,4,5,6,7,8]>>>numbers[::2]#从第1个元素开始,隔1个取元素[1,3,5,7]>>>numbers[::-1]#反向切片[8,7,6,5,4,3,2,1]>>>numbers[1:3]#指定切片开始位置和截止位置,步长默认为1[2,3]列表例5-30,列表切片操作示例。5.2>>>numbers[1::2]#指定切片开始位置和步长,省略结束位置[2,4,6,8]>>>numbers[0:10]#省略步长[1,2,3,4,5,6,7,8]>>>numbers[10:]#开始位置越界,返回空列表[]>>>numbers[2:-3]#位置2在位置-3的左侧,正向切片[3,4,5]>>>numbers[2:-3:2][3,5]>>>numbers[7:-5:-2]#位置7在位置-5的右侧,反向切片[8,6]>>>numbers[0::-1]#步长为负数时,end默认为列表第1个元素前面的位置[1]>>>numbers[0:7:-1]#步长为负数时,start位置在end位置的左侧,返回空列表[]列表5.2列表2.使用切片为列表增加/删除元素可以使用切片操作在列表任意位置插入新元素或删除元素,但这并不影响列表对象的内存地址,属于原地操作。5.2>>>num=[1,2,3,4,5]>>>num[len(num):]=[6,7,8]#在列表末尾增加[6,7,8]>>>num[1,2,3,4,5,6,7,8]>>>num[:1]=[-3,-2,-1]#用[-3,-2,-1]来替换列表的第一个元素>>>num[-3,-2,-1,2,3,4,5,6,7,8]>>>alist=[3,5,7,9]>>>alist[:3]=[]#删除列表中前3个元素>>>alist[9]列表例5-31

通过列表切片操作来增加/删除元素示例5.2列表5.2.10列表推导式列表推导式可以利用range对象、元组、列表、字典和集合等数据类型,快速生成一个满足指定需求的列表,是一种高效创建列表的方法。列表推导式使用非常简洁的方式来快速生成满足特定需求的列表,代码具有非常强的可读性。列表推导式语法形式如下:[表达式for迭代变量in可迭代对象[if条件表达式]]其中,[if条件表达式]不是必要的,可以使用,也可以省略。列表推导式在逻辑上等价于一个循环语句,只是形式上更加简洁。5.2a_range=range(10)alist=[x*xforxina_range]print("0-9的平方产生的列表为:",alist)列表例5-32

利用0-9的平方生成一个整数列表运行结果为:0-9的平方产生的列表为:[0,1,4,9,16,25,36,49,64,81]5.2>>>num=[a*aforainrange(10)ifa!=5]>>>num[0,1,4,9,16,36,49,64,81]列表例5-33

利用0-9的平方生成一个整数列表,该列表中不能包含5的平方5.2>>>nation=[‘China’,‘France’,‘England’]>>>alist=[s.strip()forsinnation]#去掉字符串的空格,如果里面带参数,则去掉字符串里的所有参数符号>>>alist[‘China’,‘France’,‘England’]列表例5-34

利用列表推导式,将原列表[‘

China’,‘France’,‘England’]元素中的所有空格去除5.2列表5.2.11判断列表中的元素是否全部或部分为TruePython的内置函数all()和any()可以判断列表的元素是否全部或部分为True,all()方法中,如果所有值都为True,则返回True,否则返回False,any()方法中,如果只要有一个值为True就返回True,否则返回False。这两个函数在大数据分析中非常实用。5.2列表5.2.12常用列表对象方法Python的内置函数all()和any()可以判断列表的元素是否全部或部分为True,all()方法中,如果所有值都为True,则返回True,否则返回False,any()方法中,如果只要有一个值为True就返回True,否则返回False。这两个函数在大数据分析中非常实用。5.2列表表5-2列表的常用方法5.2列表5.2.13列表综合案例例5-35,评委打分,演讲比赛都会有打分环节,比如有10位评委给选手打分(分数限制在60~100),选手的得分规则是:去掉1个最高分,再去掉1个最低分,余下分数的平均分即为选手的得分。现在我们用计算机模拟10位评委的打分,然后计算出选手最终得分。分析:评委打分的IPO描述如下:输入:计算机模拟评委打分处理:计算选手的得分输出:选手得分5.2列表fromrandomimportrandintn=10splist=[]#采用随机数生成10位评委的打分,分数限制在60到100之间foriinrange(n):splist.append(randint(60,100))print("{}位评委的打分为:{}".format(n,splist))splist.sort()#从小到大排序print("分数从低到高为:{}".format(splist))spnewlist=splist[1:-1]#利用切片,去掉1个最高分和1个最低分,并赋值给新列表aver=0.0fornuminspnewlist:aver+=numaver=round(aver/len(spnewlist))#计算平均值print("去掉1个最低分和1个最高分,然后分数是:{}".format(spnewlist))print("该名选手的最终得分为:{}".format(aver))5.2列表运行结果为:10位评委的打分为:[68,60,81,87,84,88,78,96,74,62]分数从低到高为:[60,62,68,74,78,81,84,87,88,96]去掉1个最低分和1个最高分,然后分数是:[62,68,74,78,81,84,87,88]该名选手的最终得分为:785.3元组列表的功能虽然很强大,但负担也很重,这在很大程度上影响了运行效率。列表可以随时修改,这对于存储一些变化的数据非常重要,但也不是任何数据都要在程序运行期间进行修改,有时候需要创建一组不可修改的元素,此时可以使用元组(tuple)。5.3.1元组的创建和删除将元组元素放置在一对圆括号“()”内,以逗号分隔,将这个元组赋值给变量,即可创建元组。Python提供了多种创建元组的方法,包括使用赋值运算符直接创建元组、创建空元组、创建数值元组等。5.3元组1.使用赋值运算符直接创建元组同其他类型的Python变量一样,在创建元组时,可以直接使用赋值运算符“=”将元组赋值。将元组元素放置在一对方括号()内,以逗号分隔,将这个元组赋值给变量,即可创建元组。5.2列表>>>tuple1=("python","JAVA","C++")#创建一个包含元素全部为字符串数据的元组>>>tuple2=(1,2,3,4,5,6)#创建一个元素全为整数的元组>>>tuple3=("python",2008,("turtle","random"),["数据分析","网络爬虫"])#创建一个元#素包含字符串、整数、元组、列表的元组>>>print(tuple1)('python','JAVA','C++')>>>print(tuple2)(1,2,3,4,5,6)>>>print(tuple3)('python',2008,('turtle','random'),['数据分析','网络爬虫'])例5-36

使用赋值运算符给不同的元组赋值5.3.1元组的创建和删除5.3元组2.创建空元组在Python中创建新的空元组的方法如下:empty_tuple=()需要注意的是,当元组中只包含一个元素时,需要在元素后面添加逗号,否则括号会被当做运算符使用。5.2列表>>>tuple1=(20)#当创建只包含一个元素的元组后面没有加逗号时,()被当做运算符,#而不是元组标识符>>>print(tuple1)#tuple1是一个整型变量20>>>print(type(tuple1))#该变量类型为int类型<class'int'>>>>tuple1=(50,)#创建只包含一个元素的元组时需要在后面添加逗号>>>print(tuple1)(50,)>>>print(type(tuple1))#该变量类型为tuple类型,即元组类型<class'tuple'>例5-37

元组示例5.3元组3.创建数值元组Python中的数值元组很常用,用于存储数值集合。Python提供了tuple()函数,它可以将range对象、字符串、列表或其他可迭代类型的数据转换为元组。4.元组的删除元组属于不可变序列,无法删除元组中的部分元素,只能使用del命令删除整个元组对象。5.2列表>>>tuple1=tuple(range(1,9))>>>tuple1(1,2,3,4,5,6,7,8)>>>tuple2=tuple([4,5,6])>>>tuple2(4,5,6)>>>tuple3=tuple("hello")>>>tuple3('h','e','l','l','o')例5-38

迭代对象创建元组示例5.2列表>>>tuple1=tuple(range(1,9))>>>tuple1(1,2,3,4,5,6,7,8)>>>deltuple1#删除该元组>>>print(tuple1)#打印该元组,由于该元组已经被删除,所以将返回报错信息Traceback(mostrecentcalllast):File"<pyshell#19>",line1,in<module>print(tuple1)NameError:name'tuple1'isnotdefined例5-39

删除元组示例5.3.2访问元组5.3元组元组与列表都是属于有序序列,元组的访问基本与列表访问一致,但元组只能正向访问。我们可以使用下标索引来访问;可以采用切片的方式来访问;还可以通过for循环实现元组遍历。5.2列表>>>tuple1=("python",2008,("turtle","random"),["数据分析","网络爬虫"])>>>tuple1[0]#通过下标索引访问元组'python'>>>tuple1[3]['数据分析','网络爬虫']>>>tuple1[2:4]#通过切片访问元组(('turtle','random'),['数据分析','网络爬虫'])>>>forelementintuple1:#通过for循环遍历元组

print(element)python2008('turtle','random')['数据分析','网络爬虫']例5-40

元组访问示例5.3.4元组的长度、最大值、最小值、求和5.3元组对于元组,可以使用Python的内置函数len()求元素个数即长度,用max()求元组的最大值,min()求元组的最小值,sum()对整个元组求和,如:>>>atuple=(85,78,90,95,68,89,85,87)>>>len(atuple)#获得元组的长度8>>>max(atuple)#获得元组的最大值95>>>min(atuple)#获得元组的最小值68>>>sum(atuple)#整个元组求和6775.3.5修改元组5.3元组元组中的元素值是不允许修改的,只要修改就会发生报错,但我们可以对元组进行重新赋值来改变元组的值,元组支持连接组合操作。5.3元组例5-41

元组修改示例>>>tuple1=("python","JAVA","C++")>>>tuple1[1]="R"#修改元组中的第二个元素Traceback(mostrecentcalllast):#报错提示

File"<pyshell#30>",line1,in<module>tuple1[1]="R"TypeError:'tuple'objectdoesnotsupportitemassignment>>>tuple1=("python","R","C++")#想要改变该元组的值就重新赋值>>>print(tuple1)('python','R','C++')>>>tuple2=("C#","C")>>>tuple3=tuple1+tuple2#将tuple1和tuple2两个元组连接>>>tuple3('python','R','C++','C#','C')5.3.6元组推导式5.3元组和生成列表一样,我们也可以使用元组推导式快速生成元组,元组推导式语法形式如下:(表达式for迭代变量in可迭代对象[if条件表达式])其中,[if条件表达式]不是必要的,可以使用,也可以省略。元组推导式在逻辑上等价于一个循环语句,只是形式上更加简洁。通过和列表推导式对比可以发现,除了元组推导式是用圆括号将各部分括起来,而列表推导式是用方括号,其他完全相同。生成器推导式比列表推导式具有更高的效率,空间占用非常少,尤其适合大数据处理的场合。5.3.6元组推导式5.3元组与列表推导式最大的不同是,生成器推导式的结果是一个生成器对象(generatorobject)。生成器对象类似于迭代器对象,具有惰性求值的特点,只在需要时生成新元祖。使用生成器对象时,可以根据需要将其转化为列表或元组,也可以使用生成器对象__next__()方法或者内置函数next()进行遍历,或者直接使用for循环来遍历其中的元素。但是不管用哪种方法访问其元素,只能从前往后访问每一个元素,不可以再次访问已访问的元素,也不支持使用下标访问其中的元素。当所有元素访问结束以后,如果需要重新访问其中的元素,必须重新创建该生成器对象。enumerate、filter、map、zip等其他迭代器对象也具有同样的特点。5.3元组例5-42

元组推导式示例>>>gg=((i+2)**2foriinrange(10))#创建生成器对象>>>gg<generatorobject<genexpr>at0x0000000002E7FDC8>>>>list(gg)[4,9,16,25,36,49,64,81,100,121]>>>tuple(gg)#生成器对象已遍历结束,没有元素了()>>>g=((i+2)**2foriinrange(10))>>>tuple(g)#将生成器对象转换为元组(4,9,16,25,36,49,64,81,100,121)>>>g=((i+2)**2foriinrange(10))#重新创建生成器对象>>>g.__next__()#使用生成器对象的__next__()方法获取元素4>>>next(g)#使用函数next()获取生成器对象中的元素95.3.7元组与列表的区别5.3元组元组和列表都属于序列,二者的区别主要体现在以下几个方面。(1)列表属于可变序列,列表中的元素可以随时修改和删除,使用append()、extend()和insert()等方法向列表中添加元素,使用del、remove()和pop()方法删除列表元素。元组属于不可变(immutable)序列,不可以直接修改元组中元素的值,也无法为元组增加或删除元素。(2)元组和列表都支持切片操作,但是列表支持使用切片方式来修改其中的元素,而元组不支持切片方式来修改其中的元素。5.3.7元组与列表的区别5.3元组元组和列表都属于序列,二者的区别主要体现在以下几个方面。(3)Python内部对元组做了大量优化,访问速度比列表更快。如果定义一系列常量值,主要用途仅是对它们进行遍历或其他类似用途,而不需要对其元素进行任何修改。一般建议使用元组而不用列表。(4)作为不可变序列,与整数、字符串一样,元组可以作为字典的键,但列表不可以。在实际应用中,经常需要在列表和元组之间进行转换,我们可以通过tuple()函数和list()函数来完成。5.3.8序列封包和序列解包5.3元组程序把多个值赋给一个变量时,Python会自动将多个值封装成元组,这种功能被称为“序列封包”。程序运行将序列直接复制给多个变量,此时序列的各元素会被依次赋值给每个变量(要求序列的元素个数和变量的个数相等),这种功能被称为“序列解包”。5.3元组例5-43

元组序列封包、序列解包示例>>>t="a","b","c"#定义一个变量t,他的值为”a”,”b”,”c”,相当于一个元组>>>t('a','b','c')#输出该变量后,他的值为元组,

即以上的定义方式即为元组的封装>>>a,b,c=t#将该元组拆封,分别赋给a,b,c3个变量>>>a'a'>>>b'b'>>>c'c'>>>x,y,z=map(str,range(3))#使用可迭代的map对象进行序列拆封,

将0、1、2转#换为字符类型,再分别赋给x,y,z变量>>>x'0'>>>y'1'>>>z'2'5.3.9常用元组对象方法5.3元组表5-3元组的常用方法5.4字典字典也是Python提供的一种常用的数据结构,它用于存放具有映射关系的数据。比如有一份学生成绩表数据,语文67分,数学91分,英语78分,如果使用列表保存这些数据,则需要两个列表,即[“语文”,“数学”,“英语”]和[67,91,78]。但是使用两个列表来保存这组数据后,就无法记录两组数据之间的关联关系。为了保存这种具有映射关系的数据,Python提供了字典,字典相当于保存了两组数据,其中一组数据是关键数据,被称为“键”(key);另一组数据可通过键来访问,被称为“值”(value)。字典(又被称为关联数组)是包含若干“键:值”元素的无序可变序列。字典中的每个元素包含用冒号分隔开的“键”和“值”两部分,表示一种映射或对应关系。定义字典时,所有的元素放在一对大括号“{}”中。5.4字典字典具有如下特性:(1)字典的元素是“键值对”,由于字典中的键是非常关键的数据,而且程序需要通过键来访问值,因此字典中的键不允许重复,必须有唯一值,而且键必须不可变。字典中的“值”是可以重复的。(2)由于字典是无序序列,因此字典不支持索引和切片,但可以通过键查询值。(3)字典是无序的对象集合,列表是有序的对象集合,两者之间的区别在于,字典当中的元素是通过键来存取的,而不是通过偏移量(索引)存取。(4)字典是可变的,并且可以任意嵌套。5.4.1字典的创建和删除5.4字典Python提供了多种创建字典的方法,包括使用赋值运算符直接创建字典、创建空字典等。1.使用赋值运算符直接创建字典字典用大括号“{}”标识。在使用大括号语法创建字典时,大括号中应包含多个键值对,键值对之间用英文冒号隔开,多个键值对之间用英语逗号隔开。字典中元素的“键”可以是Python中任意不可变数据,例如整数、实数、复数,字符串、元组等可哈希数据,但不能使用列表、集合、字典或其他可变类型数据作为字典的“键”。5.3元组例5-44

使用赋值运算符直接创建字典示例>>>grade={"语文":67,"数学":91,"英语":78}#键是中文字符串类型>>>print(grade){'语文':67,'数学':91,'英语':78}>>>score={1:9.1,2:8.9,3:8.5,4:9.0,5:8.7}#键是整数类型>>>print(score){1:9.1,2:8.9,3:8.5,4:9.0,5:8.7}>>>books_price={"Math":49,"Chinese":58}#键是英文字符串类型>>>print(books_price){'Math':49,'Chinese':58}>>>dict1={(1,2):"male",(1,3):"female"}#键是元组类型>>>print(dict1){(1,2):'male',(1,3):'female'}5.4字典2.创建空字典在Python中创建新的空字典的方法如下:empty_dict={}3.使用dict()方法创建字典Python提供了内置函数dict()来创建字典,dict里面的参数必须是可迭代对象,例如可以是列表、元组、zip()函数等。4.字典的删除字典的删除可以通过del来删除一个字典元素,或者整个字典;通过clear()方法来清楚字典所有数据,称为一个空字典。5.3元组例5-45

使用dict()方法创建字典示例>>>books=[('大学计算机',2000),('计算机导论',300),('C语言程序设计',150)]>>>books_dict=dict(books)#利用元组创建字典>>>print(books_dict){'大学计算机':2000,'计算机导论':300,'C语言程序设计':150}>>>scores=[["大学计算机",85],["大数据基础",88],["数据可视化",89]]>>>scores_dict=dict(scores)#利用列表创建字典>>>print(scores_dict){'大学计算机':85,'大数据基础':88,'数据可视化':89}>>>shopping_dict=dict(coat=598,shirt=198,socks=9.8)#通过指定参数创建字典>>>print(shopping_dict){'coat':598,'shirt':198,'socks':9.8}>>>keys=['English','Math','Chinese','Bigdata']>>>values=[79,85,78,89]>>>subject_score=dict(zip(keys,values))#使用zip()迭代器创建字典>>>print(subject_score){'English':79,'Math':85,'Chinese':78,'Bigdata':89}5.3元组例5-46

字典删除示例>>score={'English':79,'Math':85,'Chinese':78,'Bigdata':89}#定义一个字典>>>print(score){'English':79,'Math':85,'Chinese':78,'Bigdata':89}>>>delscore["Math"]#删除字典中键为“Math”的元素>>>print(score){'English':79,'Chinese':78,'Bigdata':89}>>>score.clear()#清空字典>>>print(score){}>>>delscore#删除整个字典>>>print(score)#字典被删除后已经不存在,如果这个时候来打印就会报错Traceback(mostrecentcalllast):File"<pyshell#29>",line1,in<module>print(score)NameError:name'score'isnotdefined5.4.2字典的访问5.4字典字典包含多个键值对,而键是字典的关键数据,因此对字典的操作都是基于键的。1.通过键访问值与列表和元组一样,对应字典而言,通过键访问值时使用的方法也是方括号语法,只是此时在方括号中放的是键,而不是列表或元组中的索引,若指定的键不存在,则会抛出异常。5.3元组例5-47

通过键访问值示例>>>score={'English':79,'Math':85,'Chinese':78,'Bigdata':89}>>>print("数学成绩为:",score['Math'])#通过键'Math'来获取数学成绩数学成绩为:85>>>print("线性代数成绩为:",score['LinerAlgebra'])#通过键'LinerAlgebra'来获取线#性代数成绩,但是该字典中并没有该键,所以输出时就会报错Traceback(mostrecentcalllast):File"<pyshell#34>",line1,in<module>print("线性代数成绩为:",score['LinerAlgebra'])KeyError:'LinerAlgebra'5.4.2字典的访问5.4字典2.使用字典对象的get()方法获取值使用“键”作为下标就可以访问对应的“值”,如果字典中不存在这个“键”就会抛出异常,这对程序的健壮性非常不利。我们可以通过字典对象的内置方法get()函数返回指定“键”对应的“值”,并且允许指定该键不存在时返回特定的“值”,而不是直接报错,让程序无法继续执行。get()方法语法格式如下:dictname.get(key[,default])其中dict

温馨提示

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

评论

0/150

提交评论