资源描述
单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,单击此处编辑母版标题样式,第,6,节:,组合数据类型,1/46,组合数据类型概述,2/46,计算机不但对单个变量表示数据进行处理,更通常情况,计算机需要对一组数据进行批量处理。一些例子包含:,给定一组单词,python,data,function,list,loop,,计算并输出每个单词长度;,给定一个学院学生信息,统计一下男女生百分比;,一次试验产生了很多组数据,对这些大量数据进行分析;,序列类型,3/46,以单词统计问题为例,在计算一个单词长度之前,程序需要使用一个变量表示这个单词,对于一组单词,需要很多个变量。有两个处理方案:为每个单词分配一个变量,从变量命名上加以区分,比如:,a01,、,a02,分别存放第一个、第二个元素;或者,采取一个数据结构存放这组数据,对每个元素采取索引加以区分,比如,a,表示这组元素,,a0,为该组第一个元素,,a1,为第二个元素。两个方案哪个更加好呢?显然,第二个方案更加好。假定单词数量是,500,个而不是,5,个,使用第一个方法将是灾难。另外,对每个元素单独定义变量,不利于循环操作。,序列类型,4/46,组合数据类型能够将多个同类型或不一样类型数据组织起来,经过单一表示使数据操作更有序更轻易。依据数据之间关系,组合数据类型能够分为三类:序列类型、集合类型和映射类型。,序列类型是一个元素向量,元素之间存在先后关系,经过序号访问,元素之间不排他。,集合类型是一个元素集合,元素之间无序,相同元素在集合中唯一存在。,映射类型是,“,键,-,值,”,数据项组合,每个元素是一个键值对,表示为,(key,value),。,序列类型,5/46,在,Python,中,每一类组合数据类型都对应一个或多个详细数据类型,结合本书章节安排,组合数据类型分类组成如图,6.1,所表示,其中加粗字体表示,Python,支持详细数据类型。,序列类型,6/46,序列类型是一维元素向量,元素之间存在先后关系,经过序号访问。,序列,基本思想和表示方法均起源于数学概念。在数学中,经常给每个序列一个名字,比如,,n,个数序列,S,,能够表示为:,S=s,0,s,1,s,2,.,s,n-1,当需要访问序列中某个特定值时,只需要经过下标标出即可。比如,需要找到第,2,个元素,即可经过,s,2,取得。这种采取集合名字和下标相结合表示方法能够简练地表示序列运算,比如,对上述序列,S,求和能够表示为:,序列类型,7/46,因为元素之间存在次序关系,所以序列中能够存在相同数值但位置不一样元素。序列类型支持组员关系操作符(,in,)、长度计算函数(,len(),)、分片(,),元素本身也能够是序列类型。,序列类型,8/46,Python,语言中有很多数据类型都是序列类型,其中比较主要是:,str,(字符串)、,tuple,(元组)和,list,(列表)。,字符串(,str,)能够看成是单一字符有序组合,属于序列类型。同时,因为字符串类型十分惯用且单一字符串只表示一个含义,也被看作是基本数据类型。,元组是包含,0,个或多个数据项不可变序列类型。元组生成后是固定,其中任何数据项不能替换或删除。,列表则是一个能够修改数据项序列类型,使用也最灵活,序列类型,9/46,序列类型,10/46,序列类型有,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总次数,11/46,元组(,tuple,)是序列类型中比较特殊类型,因为它一旦创建就不能被修改。元组类型在表示固定数据项、函数多返回值、多变量同时赋值、循环遍历等情况下十分有用。,Python,中元组采取逗号和圆括号(可选)来表示,例子以下。,序列类型,12/46,生成元组只需要使用逗号将元素隔离开即可,比如上例中元组,creature,,也能够增加圆括号,但圆括号在不混同语义情况下不是必须。,一个元组能够作为另一个元组元素,能够采取多级索引获取信息,比如元组,color,中包含了元组,creature,,能够用,color-12,获取对应元素值。,元组除了用于表示固定数据项外,还惯用于以下,3,种情况:函数多返回值、多变量同时赋值、循环遍历,例子以下,序列类型,13/46,序列类型,14/46,集合类型与数学中集合概念一致,即包含,0,个或多个数据项无序组合。集合中元素不可重复,元素类型只能是固定数据类型,比如:整数、浮点数、字符串、元组等,列表、字典和集合类型本身都是可变数据类型,不能作为集合元素出现。,Python,编译器中界定固定数据类型是否主要考查类型是否能够进行哈希运算。能够进行哈希运算类型,都能够作为集合元素。,Python,提供了一个同名详细数据类型集合(,set,)。,集合类型,15/46,因为集合是无序组合,它没有索引和位置概念,不能分片,集合中元素能够动态增加或删除。集适用大括号(,)表示,能够用赋值语句生成一个集合,例子以下。,集合类型,16/46,从上例能够看到,因为集合元素是无序,集合打印效果与定义次序能够不一致。因为集合元素独一无二,使用集合类型能够过滤掉重复元素。,set(x),函数能够用于生成集合,输入参数能够是任何组合数据类型,返回结果是一个无重复且排序任意集合,例子以下。,集合类型,17/46,集合类型有,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中元素,但不包含同时在其中元素,18/46,集合类型有,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真超集,19/46,上述操作符表示了集合类型,4,种基本操作,交集(,&,)、并集(,|,)、差集(,-,)、补集(,),操作逻辑与数学定义相同,,集合类型,20/46,集合类型有,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不在,不报错,21/46,集合类型有,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,22/46,集合类型主要用于三个场景:组员关系测试、元素去重和删除数据项,例子以下。,集合类型与其它类型最大不一样在于它不包含重复元素,所以,当需要对一维数据进行去重或进行数据重复处理时,普通经过集合来完成。,集合类型,23/46,映射类型是“键,-,值”数据项组合,每个元素是一个键值对,即元素是,(key,value),,元素之间是无序。键值对,(key,value),是一个二元关系,源于属性和值映射关系,键(,key,)表示一个属性,也能够了解为一个类别或项目,值(,value,)是属性内容,键值对刻画了一个属性和它值。键值对将映射关系结构化,用于存放和表示。在,Python,中,映射类型主要以字典(,dict,)表示,映射类型,24/46,映射类型,25/46,列表类型和操作,26/46,列表(,list,)是包含,0,个或多个对象引用有序序列,属于序列类型。与元组不一样,列表长度和内容都是可变,可自由对列表中数据项进行增加、删除或替换。列表没有长度限制,元素类型能够不一样,使用非常灵活。,因为列表属于序列类型,所以列表也支持组员关系操作符(,in,)、长度计算函数(,len(),)、分片(,)。列表能够同时使用正向递增序号和反向递减序号,能够采取标准比较操作符(,、,=,、,)进行比较,列表比较实际上是单个数据项逐一比较。,列表类型概念,27/46,列表用中括号(,)表示,也能够经过,list(),函数将元组或字符串转化成列表。直接使用,list(),函数会返回一个空列表,例子以下。,列表类型概念,28/46,与整数和字符串不一样,列表要处理一组数据,所以,列表必须经过显式数据赋值才能生成,简单将一个列表赋值给另一个列表不会生成新列表对象,例子以下。,列表类型概念,29/46,如上例所表示,,ls,由实际数据赋值产生,为列表对象。将,ls,赋值给列表,lt,仅能产生对列表,ls,一个新引用,此时,,lt,和,ls,变量都是实际数据,425,BIT,1024,表示或引用,真实数据只存放一份,所以,修改,ls,也同时修改了,ls,,这个关系如图,6.5,所表示。,列表类型概念,30/46,函数或方法,描述,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个常用函数或方法。,列表类型操作,31/46,函数或方法,描述,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,中元素反转,列表类型操作,32/46,上述操作符主要处理列表增删改等功效,列表类型操作,33/46,上述例子中,,vlist3,从整数变成了字符串,子序列,vlist1:3,被另一个列表赋值修改。需要注意,当使用一个列表改变另一个列表值时,,Python,不要求两个列表长度一样,但遵照“多增少减”标准,例子以下。,列表类型操作,34/46,vlist1:3子序列包含2个元素,对其赋值时却给了3个元素,Python接收这种方式,并不会报错,vlist结果包含了赋值列表中多出元素。一样,当使用包含更少元素赋值列表时,原列表元素会对应降低。能够经过赋给更多或更少元素实现对列表元素插入或删除。,与元组一样,列表能够经过forin语句对其元素进行遍历,基本语法结构以下,for in :,语句块,列表类型操作,35/46,列表是一个十分灵活数据结构,它含有处理任意长度、混合类型能力,并提供了丰富基础操作符和方法。当程序需要使用组合数据类型管理批量数据时,请尽可能使用列表类型。,列表类型操作,36/46,基本统计值计算,37/46,统计是计算科学、管理学、社会学、数学等很多领域基本问题,相关问题、方法和技术组成了一门学科,即,“,统计学,”,。,Python,列表数据结构能够支持基本数据统计应用。本节以最简单统计问题为例,求解一组不定长数据基本统计值,即平均值、标准差、中位数。,一组数据表示为,S=s,0,s,1,s,n-1,,其算术平均值、标准差分别表示为:,和,基本统计值计算,38/46,中位数指,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,描述以下:,输入:从用户输入、文件、网络等路径获取一组数据;,处理:适当数据结构和算法,输出:平均值、标准差和中位数,基本统计值计算,39/46,因为平均数、标准差和中位数是三个不一样计算目标,使用函数方式编写计算程序。定义,getNum(),函数从用户输入取得数据,,mean(),函数计算平均值,,dev(),函数计算标准差,,median(),函数计算中位数。因为该问题不限制用户输入数据最大个数,所以,使用列表作为承载和存放数据数据类型。实例代码,9.1,全部代码以下。,基本统计值计算,40/46,基本统计值计算,41/46,基本统计值计算,42/46,请输入数字,(,直接输入回车退出,):,99,请输入数字,(,直接输入回车退出,):,98,请输入数字,(,直接输入回车退出,):,97,请输入数字,(,直接输入回车退出,):,96,请输入数字,(,直接输入回车退出,):,95,请输入数字,(,直接输入回车退出,):,平均值,:97.0,方差,:1.6,中位数,:97.,该程序运行结果以下,程序整体从第,28,行开始执行,先后调用,getNum(),、,mean(),、,dev(),和,median(),函数。利用函数模块化设计能够复用代码并增加代码可读性。每个函数内部都采取了简单语句。,基本统计值计算,43/46,getNum(),函数循环从控制台取得用户输入数字,当用户输入回车时退出,全部数据保留在,nums,列表中。列表,nums,初始化时定义为空,而后依据输入逐步增加其长度。,mean(),函数用浮点数,s,统计列表,numbers,求和结果。其中,,for,语句表示从列表,numbers,中取出每一个元素,将其加到,s,变量中,直到,numbers,中最终一个元素。最终,经过,return,语句返回平均值,,len(numbers),用于计算列表长度。,基本统计值计算,44/46,为了计算标准差,需要知道数据平均值,因为,mean(),函数已经能够计算平均值,将均值作为一个参数输入标准差,dev(),函数。,dev(),函数中,(val)*2,用于计算,val,平方,,sqrt(val),计算,val,平方根。,基本统计值计算,45/46,依据中位数定义,中位数,median(),函数首先使用,Python,内置函数,sorted(),对列表,numbers,进行排序,然后依据中位数定义计算中位数。,列表在实现基本数据统计时发挥了很主要作用,主要表现在:,列表是一个动态长度数据结构,能够依据需求增加或降低元素;,列表一系列方法或操作符为计算提供了简单元素运算伎俩;,列表提供了对每个元素简单访问方式及全部元素遍历方式。,基本统计值计算,46/46,
展开阅读全文