资源描述
Click to edit Master title style,Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,*,*,*,*,电子教案组合数据类型,组合数据类型概述,计算机不仅对单个变量表示的数据进行处理,更通常情况,计算机需要对一组数据进行批量处理。一些例子包括:,给定一组单词,python,data,function,list,loop,,计算并输出每个单词的长度;,给定一个学院学生信息,统计一下男女生比例;,一次实验产生了很多组数据,对这些大量数据进行分析;,序列类型,以单词统计问题为例,在计算一个单词长度之前,程序需要使用一个变量表示这个单词,对于一组单词,需要很多个变量。有两个解决方案:为每个单词分配一个变量,从变量命名上加以区分,例如:,a01,、,a02,分别存储第一个、第二个元素;或者,采用一个数据结构存储这组数据,对每个元素采用索引加以区分,例如,a,表示这组元素,,a0,为该组第一个元素,,a1,为第二个元素。两个方案哪个更好呢?显然,第二个方案更好。假定单词数量是,500,个而不是,5,个,使用第一种方法将是灾难。此外,对每个元素单独定义变量,不利于循环操作。,序列类型,将列表lt元素增加到列表ls中,元组(tuple)是序列类型中比较特殊的类型,因为它一旦创建就不能被修改。,根据数据之间的关系,组合数据类型可以分为三类:序列类型、集合类型和映射类型。,用列表lt替换列表ls中第i到j项数据(不含第j项,下同),集合类型有10个操作函数或方法,集合类型与其他类型最大的不同在于它不包含重复元素,因此,当需要对一维数据进行去重或进行数据重复处理时,一般通过集合来完成。,返回一个新集合,包括集合S和T中元素,但不包括同时在其中的元素,一组数据表示为S=s0,s1,sn-1,其算术平均值、标准差分别表示为:,统计是计算科学、管理学、社会学、数学等诸多领域的基本问题,相关问题、方法和技术组成了一门学科,即“统计学”。,del lsi:j:k,有两个解决方案:为每个单词分配一个变量,从变量命名上加以区分,例如:a01、a02分别存储第一个、第二个元素;,假定单词数量是500个而不是5个,使用第一种方法将是灾难。,有两个解决方案:为每个单词分配一个变量,从变量命名上加以区分,例如:a01、a02分别存储第一个、第二个元素;,请输入数字(直接输入回车退出):95,有两个解决方案:为每个单词分配一个变量,从变量命名上加以区分,例如:a01、a02分别存储第一个、第二个元素;,组合数据类型能够将多个同类型或不同类型的数据组织起来,通过单一的表示使数据操作更有序更容易。根据数据之间的关系,组合数据类型可以分为三类:序列类型、集合类型和映射类型。,序列类型是一个元素向量,元素之间存在先后关系,通过序号访问,元素之间不排他。,集合类型是一个元素集合,元素之间无序,相同元素在集合中唯一存在。,映射类型是,“,键,-,值,”,数据项的组合,每个元素是一个键值对,表示为,(key,value),。,序列类型,在,Python,中,每一类组合数据类型都对应一个或多个具体的数据类型,结合本书章节安排,组合数据类型的分类构成如图,6.1,所示,其中加粗字体表示,Python,支持的具体数据类型。,序列类型,序列类型是一维元素向量,元素之间存在先后关系,通过序号访问。,序列的,基本思想和表示方法均来源于数学概念。在数学中,经常给每个序列一个名字,例如,,n,个数的序列,S,,可以表示为:,S=s,0,s,1,s,2,.,s,n-1,当需要访问序列中某个特定值时,只需要通过下标标出即可。例如,需要找到第,2,个元素,即可通过,s,2,获得。这种采用集合名字和下标相结合的表示方法可以简洁地表示序列运算,例如,对上述序列,S,求和可以表示为:,序列类型,由于元素之间存在顺序关系,所以序列中可以存在相同数值但位置不同的元素。序列类型支持成员关系操作符(,in,)、长度计算函数(,len(),)、分片(,),元素本身也可以是序列类型。,序列类型,Python,语言中有很多数据类型都是序列类型,其中比较重要的是:,str,(字符串)、,tuple,(元组)和,list,(列表)。,字符串(,str,)可以看成是单一字符的有序组合,属于序列类型。同时,由于字符串类型十分常用且单一字符串只表达一个含义,也被看作是基本数据类型。,元组是包含,0,个或多个数据项的不可变序列类型。元组生成后是固定的,其中任何数据项不能替换或删除。,列表则是一个可以修改数据项的序列类型,使用也最灵活,序列类型,序列类型,序列类型有,12,个通用的操作符和函数,序列类型,操作符,描述,x in s,如果,x,是,s,的元素,返回,True,,否则返回,False,x not in s,如果,x,不是,s,的元素,返回,True,,否则返回,False,s+t,连接,s,和,t,s*n,或,n*s,将序列,s,复制,n,次,si,索引,返回序列的第,i,个元素,si:j,分片,返回包含序列,s,第,i,到,j,个元素的子序列(不包含第,j,个元素),si:j:k,步骤分片,返回包含序列,s,第,i,到,j,个元素以,j,为步数的子序列,len(s),序列,s,的元素个数(长度),min(s),序列,s,中的最小元素,max(s),序列,s,中的最大元素,s.index(x,i,j),序列,s,中从,i,开始到,j,位置中第一次出现元素,x,的位置,s.count(x),序列,s,中出现,x,的总次数,元组(,tuple,)是序列类型中比较特殊的类型,因为它一旦创建就不能被修改。元组类型在表达固定数据项、函数多返回值、多变量同步赋值、循环遍历等情况下十分有用。,Python,中元组采用逗号和圆括号(可选)来表示,例子如下。,序列类型,有两个解决方案:为每个单词分配一个变量,从变量命名上加以区分,例如:a01、a02分别存储第一个、第二个元素;,上述操作符主要处理列表的增删改等功能,Python编译器中界定固定数据类型与否主要考察类型是否能够进行哈希运算。,定义getNum()函数从用户输入获得数据,mean()函数计算平均值,dev()函数计算标准差,median()函数计算中位数。,定义getNum()函数从用户输入获得数据,mean()函数计算平均值,dev()函数计算标准差,median()函数计算中位数。,元组除了用于表达固定数据项外,还常用于如下3种情况:函数多返回值、多变量同步赋值、循环遍历,例子如下,不在产生KeyError异常,集合类型有10个操作函数或方法,在列表ls最后增加一个元素x,生成一个新列表,复制ls中所有元素,不在产生KeyError异常,生成元组只需要使用逗号将元素隔离开即可,例如上例中的元组creature,也可以增加圆括号,但圆括号在不混淆语义的情况下不是必须的。,有两个解决方案:为每个单词分配一个变量,从变量命名上加以区分,例如:a01、a02分别存储第一个、第二个元素;,列表nums初始化时定义为空,而后根据输入逐渐增加其长度。,此外,对每个元素单独定义变量,不利于循环操作。,生成元组只需要使用逗号将元素隔离开即可,例如上例中的元组,creature,,也可以增加圆括号,但圆括号在不混淆语义的情况下不是必须的。,一个元组可以作为另一个元组的元素,可以采用多级索引获取信息,例如元组,color,中包含了元组,creature,,可以用,color-12,获取对应元素值。,元组除了用于表达固定数据项外,还常用于如下,3,种情况:函数多返回值、多变量同步赋值、循环遍历,例子如下,序列类型,序列类型,集合类型与数学中集合的概念一致,即包含,0,个或多个数据项的无序组合。集合中元素不可重复,元素类型只能是固定数据类型,例如:整数、浮点数、字符串、元组等,列表、字典和集合类型本身都是可变数据类型,不能作为集合的元素出现。,Python,编译器中界定固定数据类型与否主要考察类型是否能够进行哈希运算。能够进行哈希运算的类型,都可以作为集合元素。,Python,提供了一种同名的具体数据类型集合(,set,)。,集合类型,由于集合是无序组合,它没有索引和位置的概念,不能分片,集合中元素可以动态增加或删除。集合用大括号(,)表示,可以用赋值语句生成一个集合,例子如下。,集合类型,从上例可以看到,由于集合元素是无序的,集合的打印效果与定义顺序可以不一致。由于集合元素独一无二,使用集合类型能够过滤掉重复元素。,set(x),函数可以用于生成集合,输入的参数可以是任何组合数据类型,返回结果是一个无重复且排序任意的集合,例子如下。,集合类型,集合类型有,10,个操作符,集合类型,操作符,描述,S T,或,S.difference(T),返回一个新集合,包括在集合,S,中但不在集合,T,中的元素,S-=T,或,S.difference_update(T),更新集合,S,,包括在集合,S,中但不在集合,T,中的元素,S&T,或,S.intersection(T),返回一个新集合,包括同时在集合,S,和,T,中的元素,S&=T,或,S.intersection_update(T),更新集合,S,,包括同时在集合,S,和,T,中的元素。,ST,或,s.symmetric_difference(T),返回一个新集合,包括集合,S,和,T,中元素,但不包括同时在其中的元素,S=T,或,s.symmetric_difference_update(T),更新集合,S,,包括集合,S,和,T,中元素,但不包括同时在其中的元素,集合类型有,10,个操作符,集合类型,操作符,描述,S|T,或,S.union(T),返回一个新集合,包括集合,S,和,T,中所有元素,S=|T,或,S.update(T),更新集合,S,,包括集合,S,和,T,中所有元素,S=T,或,S.issubset(T),如果,S,与,T,相同或,S,是,T,的子集,返回,True,,否则返回,False,,可以用,S=T,或,S.issuperset(T),如果,S,与,T,相同或,S,是,T,的超集,返回,True,,否则返回,False,,可以用,ST,判断,S,是否是,T,的真超集,上述操作符表达了集合类型的,4,种基本操作,交集(,&,)、并集(,|,)、差集(,-,)、补集(,),操作逻辑与数学定义相同,,集合类型,元组是包含0个或多个数据项的不可变序列类型。,随机返回集合S中的一个元素,如果S为空,产生KeyError异常,同样,当使用包含更少元素赋值列表时,原列表元素会相应减少。,del lsi:j,元组(tuple)是序列类型中比较特殊的类型,因为它一旦创建就不能被修改。,索引,返回序列的第i个元素,以单词统计问题为例,在计算一个单词长度之前,程序需要使用一个变量表示这个单词,对于一组单词,需要很多个变量。,如果S与T相同或S是T的子集,返回True,否则返回False,可以用ST判断S是否是T的真子集,映射类型是“键-值”数据项的组合,每个元素是一个键值对,表示为(key,value)。,本节以最简单的统计问题为例,求解一组不定长数据的基本统计值,即平均值、标准差、中位数。,一个元组可以作为另一个元组的元素,可以采用多级索引获取信息,例如元组color中包含了元组creature,可以用color-12获取对应元素值。,用列表lt替换列表ls中第i到j以k为步的数据,intersection(T),将ls赋值给列表lt仅能产生对列表ls的一个新的引用,此时,lt和ls变量都是实际数据425,BIT,1024的表示或引用,真实数据只存储一份,因此,修改ls也同时修改了ls,这个关系如图6.,索引,返回序列的第i个元素,集合类型有,10,个操作函数或方法,集合类型,函数或方法,描述,S.add(x),如果数据项,x,不在集合,S,中,将,x,增加到,s,S.clear(),移除,S,中所有数据项,S.copy(),返回集合,S,的一个拷贝,S.pop(),随机返回集合,S,中的一个元素,如果,S,为空,产生,KeyError,异常,S.discard(x),如果,x,在集合,S,中,移除该元素;如果,x,不在,不报错,集合类型有,10,个操作函数或方法,集合类型,函数或方法,描述,S.remove(x),如果,x,在集合,S,中,移除该元素;不在产生,KeyError,异常,S.isdisjoint(T),如果集合,S,与,T,没有相同元素,返回,True,len(S),返回集合,S,元素个数,x in S,如果,x,是,S,的元素,返回,True,,否则返回,False,x not in S,如果,x,不是,S,的元素,返回,True,,否则返回,False,集合类型主要用于三个场景:成员关系测试、元素去重和删除数据项,例子如下。,集合类型与其他类型最大的不同在于它不包含重复元素,因此,当需要对一维数据进行去重或进行数据重复处理时,一般通过集合来完成。,集合类型,映射类型是“键,-,值”数据项的组合,每个元素是一个键值对,即元素是,(key,value),,元素之间是无序的。键值对,(key,value),是一种二元关系,源于属性和值的映射关系,键(,key,)表示一个属性,也可以理解为一个类别或项目,值(,value,)是属性的内容,键值对刻画了一个属性和它的值。键值对将映射关系结构化,用于存储和表达。在,Python,中,映射类型主要以字典(,dict,)体现,映射类型,映射类型,列表类型和操作,列表(,list,)是包含,0,个或多个对象引用的有序序列,属于序列类型。与元组不同,列表的长度和内容都是可变的,可自由对列表中数据项进行增加、删除或替换。列表没有长度限制,元素类型可以不同,使用非常灵活。,由于列表属于序列类型,所以列表也支持成员关系操作符(,in,)、长度计算函数(,len(),)、分片(,)。列表可以同时使用正向递增序号和反向递减序号,可以采用标准的比较操作符(,、,=,、,)进行比较,列表的比较实际上是单个数据项的逐个比较。,列表类型的概念,列表用中括号(,)表示,也可以通过,list(),函数将元组或字符串转化成列表。直接使用,list(),函数会返回一个空列表,例子如下。,列表类型的概念,与整数和字符串不同,列表要处理一组数据,因此,列表必须通过显式的数据赋值才能生成,简单将一个列表赋值给另一个列表不会生成新的列表对象,例子如下。,列表类型的概念,如上例所示,,ls,由实际数据赋值产生,为列表对象。将,ls,赋值给列表,lt,仅能产生对列表,ls,的一个新的引用,此时,,lt,和,ls,变量都是实际数据,425,BIT,1024,的表示或引用,真实数据只存储一份,因此,修改,ls,也同时修改了,ls,,这个关系如图,6.5,所示。,列表类型的概念,函数或方法,描述,lsi=x,替换列表,ls,第,i,数据项为,x,lsi:j=lt,用列表,lt,替换列表,ls,中第,i,到,j,项数据(不含第,j,项,下同),lsi:j:k=lt,用列表,lt,替换列表,ls,中第,i,到,j,以,k,为步的数据,del lsi:j,删除列表,ls,第,i,到,j,项数据,等价于,lsi:j=,del lsi:j:k,删除列表,ls,第,i,到,j,以,k,为步的数据,列表是序列类型,因此,表,6.1,中,12,个序列类型的操作符和函数都可用于列表类型。,由于列表是可变的,表,6.4,给出了列表类型额外的,14,个常用函数或方法。,列表类型的操作,函数或方法,描述,ls+=lt,或,ls.extend(lt),将列表,lt,元素增加到列表,ls,中,ls*=n,更新列表,ls,,其元素重复,n,次,ls.append(x),在列表,ls,最后增加一个元素,x,ls.clear(),删除,ls,中所有元素,ls.copy(),生成一个新列表,复制,ls,中所有元素,ls.insert(i,x),在列表,ls,第,i,位置增加元素,x,ls.pop(i),将列表,ls,中第,i,项元素取出并删除该元素,ls.remove(x),将列表中出现的第一个元素,x,删除,ls.reverse(x),列表,ls,中元素反转,列表类型的操作,上述操作符主要处理列表的增删改等功能,列表类型的操作,上述例子中,,vlist3,从整数变成了字符串,子序列,vlist1:3,被另一个列表赋值修改。需要注意,当使用一个列表改变另一个列表值时,,Python,不要求两个列表长度一样,但遵循“多增少减”的原则,例子如下。,列表类型的操作,vlist1:3,子序列包含,2,个元素,对其赋值时却给了,3,个元素,,Python,接受这种方式,并不会报错,,vlist,结果包含了赋值列表中的多余元素。同样,当使用包含更少元素赋值列表时,原列表元素会相应减少。可以通过赋给更多或更少元素实现对列表元素的插入或删除。,与元组一样,列表可以通过,forin,语句对其元素进行遍历,基本语法结构如下,for in :,语句块,列表类型的操作,列表是一个十分灵活的数据结构,它具有处理任意长度、混合类型的能力,并提供了丰富的基础操作符和方法。当程序需要使用组合数据类型管理批量数据时,请尽量使用列表类型。,列表类型的操作,基本统计值计算,统计是计算科学、管理学、社会学、数学等诸多领域的基本问题,相关问题、方法和技术组成了一门学科,即,“,统计学,”,。,Python,的列表数据结构能够支持基本的数据统计应用。本节以最简单的统计问题为例,求解一组不定长数据的基本统计值,即平均值、标准差、中位数。,一组数据表示为,S=s,0,s,1,s,n-1,,其算术平均值、标准差分别表示为:,和,基本统计值的计算,中位数指,S,中所有数按照从小到大(或者从大到小)顺序排列后,处于最中间位置的数据值。如果,n,是奇数,则序列,S,的最中间位置是一个数据,可以表示为,s,n/2,;如果,n,是偶数,序列,S,不存在一个最中间位置,则中位数表示为最中间两个位置数据的平均值,即,(,s,n/2-1,+,s,n/2,)/2,。,例如:(,5,2,1,3,4,)的中位数是,3,,而(,4,2,1,3,)的中位数是,(2+3)/2,为,2.5,。这个问题的,IPO,描述如下:,输入:从用户输入、文件、网络等途径获取一组数据;,处理:适当的数据结构和算法,输出:平均值、标准差和中位数,基本统计值的计算,由于平均数、标准差和中位数是三个不同的计算目标,使用函数方式编写计算程序。定义,getNum(),函数从用户输入获得数据,,mean(),函数计算平均值,,dev(),函数计算标准差,,median(),函数计算中位数。由于该问题不限制用户输入数据的最大个数,所以,使用列表作为承载和存储数据的数据类型。实例代码,9.1,的全部代码如下。,基本统计值的计算,基本统计值的计算,基本统计值的计算,请输入数字,(,直接输入回车退出,):,99,请输入数字,(,直接输入回车退出,):,98,请输入数字,(,直接输入回车退出,):,97,请输入数字,(,直接输入回车退出,):,96,请输入数字,(,直接输入回车退出,):,95,请输入数字,(,直接输入回车退出,):,平均值,:97.0,方差,:1.6,中位数,:97.,该程序运行结果如下,程序整体从第,28,行开始执行,先后调用,getNum(),、,mean(),、,dev(),和,median(),函数。利用函数的模块化设计能够复用代码并增加代码的可读性。每个函数内部都采用了简单的语句。,基本统计值的计算,getNum(),函数循环从控制台获得用户输入的数字,当用户输入回车时退出,所有数据保存在,nums,列表中。列表,nums,初始化时定义为空,而后根据输入逐渐增加其长度。,mean(),函数用浮点数,s,记录列表,numbers,求和的结果。其中,,for,语句表示从列表,numbers,中取出每一个元素,将其加到,s,变量中,直到,numbers,中最后一个元素。最后,通过,return,语句返回平均值,,len(numbers),用于计算列表的长度。,基本统计值的计算,为了计算标准差,需要知道数据的平均值,由于,mean(),函数已经可以计算平均值,将均值作为一个参数输入标准差,dev(),函数。,dev(),函数中,(val)*2,用于计算,val,的平方,,sqrt(val),计算,val,的平方根。,基本统计值的计算,
展开阅读全文