第六章数据结构ppt课件.ppt
2023/1/16,1,Python语言编程导论,第六章 数据结构张晋连 2016.10,主要内容,概述序列通用操作字符串列表元组字典集合,2023/1/16,2,一、概述,Python提供了功能强大的内置数据结构。包括:字符串列表元组字典集合,2023/1/16,3,序列,二、序列通用操作,Python中,字符串、列表和元组都属于序列。序列有一些通用的操作。包括:索引(indexing)、切片(slicing)、加(adding)、乘(multiplying)、检查某个元素是否属于序列的成员(成员资格)、计算序列长度、找出最大元素和最小元素等。,2023/1/16,4,序列相关操作,2023/1/16,5,标准类型运算符,2023/1/16,6,标准类型运算符示例,2023/1/16,7,序列类型运算符,2023/1/16,8,序列的索引,序列中的所有元素都有编号。从0开始递增。这些元素可以通过编号分别访问。索引有正索引和负索引,可根据实际情况选用。例如:字符串apple的正索引和负索引,2023/1/16,9,序列类型运算符示例,2023/1/16,10,序列类型转换工厂函数,2023/1/16,11,序列类型可用内建函数,2023/1/16,12,说明:在循环中引用相关函数,可以高效地得出相应结果。,2023/1/16,13,例:同时获取序列索引及值例:同时循环两个或多个序列,2023/1/16,14,例:逆向循环序列例:按排序后的顺序循环序列,三、字符串,在Python中,字符串是除数字外最重要的数据类型。字符串无处不在:将字符串输出到屏幕上;从用户的键盘输入读取字符串;文件通常被视为大型字符串;网页大部分是由文本组成的。可充分利用索引和切片用于从字符串中提取子串。虽然Python字符串提供了众多实用的函数,但实际处理字符串时,常常需要更强大的工具。Python提供了一种用于复杂字符串处理的微型语言正则表达式,但正则表达式并不是Python的一部分。,2023/1/16,15,例6-1:温度转换程序,2023/1/16,16,例6-2:输入一个月份数字,返回对应月份名称缩写,2023/1/16,17,1、字符串格式化,C语言使用函数printf()格式化输出结果,Python也提供了类似功能。Python将若干值插入带有“%”标记的字符串中,从而可以按照指定格式输出字符串。语法:%s%str1%s%s%(str1,str2),2023/1/16,18,例6-3:格式化字符串,2023/1/16,19,执行结果:,例6-4:带精度的格式化,2023/1/16,20,执行结果:,Python格式化字符串的替代符及含义:,2023/1/16,21,例6-5:符号、对齐和用0填充,在字段宽度和精度之间还可以放置一个“标志”,该标志可以是零、加号、减号或空格。零表示数字将会用0填充。,2023/1/16,22,执行结果:,2、字符串的转义字符,计算机中存在可见字符与不可见字符。可见字符指键盘上的字母、数字和符号。不可见字符是指换行、回车、制表符等字符。对于不可见字符,Python使用的方法类似于C语言,都是使用“”作为转义字符。Python还提供了函数strip()、lstrip()、rstrip()去除字符串中的转义字符。,2023/1/16,23,Python常用的转义字符及其含义,2023/1/16,24,例6-6:转义字符应用,2023/1/16,25,执行结果:,3、字符串的常用方法,Python字符串自带了大量很有用的方法(字符串类内定义的函数),可调用dir并将参数指定为任何字符串(如:dir())来查看它们。虽无必要准确记住所有字符串方法功能,但最好有个大致了解,这样有益于需要时去查询具体使用。字符串方法的详细介绍可参阅其文档字符串或Python在线文档(https:/docs.python.org/3/)。此处介绍常用的字符串方法。,2023/1/16,26,字符串常用方法,2023/1/16,27,(1)字符串测试,2023/1/16,28,用于检测字符串是否为特定格式,它们组成了一个最大的字符串方法组。测试方法的值都返回True或False。,例如:,2023/1/16,29,(2)字符串的查找,2023/1/16,30,说明:方法index和find之间的差别在于没有找到指定子串的情形。方法index引发异常ValueError,而方法find将返回-1。,例6-7:查找方法应用,2023/1/16,31,(3)字符串的替换,2023/1/16,32,Python字符串自带了两个替换方法,如下表所示。,注意:使用替换方法可轻松地删除字符串中的子串。,例6-8:字符串替换,2023/1/16,33,(4)字符串拆分,2023/1/16,34,拆分方法将字符串拆分成多个子串。如下表所示。,例6-9:拆分字符串,2023/1/16,35,执行结果:,例6-10:使用split()方法获取子串,2023/1/16,36,执行结果:,(5)改变大小写,2023/1/16,37,说明:在以上函数中,Python都创建并返回一个新字符串,Python不会真正修改原字符串。,例如:,2023/1/16,38,例6-11:,如从网络上下载的类似如下形式的一些句子:What do you think of this saying No pain,No gain?对于句子中双引号中的内容,首先判断其是否满足标题格式,不管满足与否最终都将其转换为标题格式输出。,2023/1/16,39,2023/1/16,40,(6)设置字符串格式,2023/1/16,41,例6-12:设置格式,2023/1/16,42,执行结果:,(7)字符串剥除,2023/1/16,43,剥除方法用于删除字符串开头或末尾多余的字符。如下表所示。默认情况下,剥除空白字符;如果指定了字符串参数,则剥除该字符串中的字符(空白字符包括:空格本身、回车r、回车换行n、制表符t、换页符f)。,例6-13:字符串剥除,2023/1/16,44,例6-14:去除转义字符,2023/1/16,45,(8)字符串比较,Python直接使用“=”“!=”操作符比较两个字符串的内容。若要比较字符串的部分内容,可以先截取子串,再使用“=”“!=”操作符进行比较。若要比较字符串的开头和结尾部分,更方便的方式是使用startswith()或endswith()函数。startswith()与endswith()的声明为:startswith(substring,start,end)endswith(substring,start,end),2023/1/16,46,例6-15:比较字符串开始和结束处,2023/1/16,47,执行结果:,(9)字符串的合并,之前介绍过,Python可使用“+”连接不同的字符串。除此之外,还可以使用join方法(是split方法的逆方法)和reduce函数实现字符串的合并。说明:reduce是functools模块中的函数。,2023/1/16,48,例6-16:使用join函数连接字符串,2023/1/16,49,执行结果:,例6-17:使用reduce函数连接字符串,2023/1/16,50,执行结果:,5、字符串与日期的转换,在实际应用中,经常需要将日期类型与字符串类型互相转换。Python提供了time模块处理日期和时间。函数strftime()可以实现从时间到字符串的转换。字符串到时间的转换要进行两次转换,需要使用time模块和datetime类。,2023/1/16,51,strftime()函数:,声明:strftime(format,tuple)-string说明:参数format表示格式化日期的特殊字符。例如:“%Y-%m-%d”相当于“yyyy-MM-dd”.参数tuple表示需要转换的时间,用元组存储。元组中的元素分别表示年、月、日、时、分、秒。函数返回一个表示时间的字符串。,2023/1/16,52,字符串到时间的转换步骤:,第一次转换:调用函数strptime()将字符串转换为一个元组。其声明为:strptime(string,format)-struct_time函数返回一个存放时间的元组。第二次转换:将表示年、月、日的3个变量传递给函数datetime()。datetime类的datetime()函数格式为:datetime(year,month,day,hour,minute,second,microsecond,tzinfo)函数返回一个date类型的变量。,2023/1/16,53,格式化日期的常用标记,2023/1/16,54,例6-18:时间与字符串的互相转换,2023/1/16,55,执行结果:,课堂练习一:,课堂练习一,2023/1/16,56,四、列表,列表是Python中非常重要的数据类型,通常作为函数的返回类型。列表由一组元素组成。列表可包含任何类型的值:数字、字符串甚至序列。列表是可变的,即可以在不复制的情况下添加、删除或修改列表元素。,2023/1/16,57,1、列表的创建,格式:list=元素1,元素2,元素n#定义n个元素组成的列表 list=#定义空列表 list=x#定义只包含一个元素的列表说明:列表用方括号括起,其中元素用逗号分隔。,2023/1/16,58,列表的形式,2023/1/16,59,例6-19:创建列表,2023/1/16,60,2、列表的使用,列表也是序列,其使用与字符串十分相似,同样支持负数索引、分片等特性,但列表的元素可修改。与字符串一样,可使用len获取列表长度,还可使用+和*拼接列表。,2023/1/16,61,例6-20:列表的使用,2023/1/16,62,3、常用列表方法,2023/1/16,63,说明:所有适用于序列的函数均适用于元组。,例6-21:在列表末尾添加元素或列表,2023/1/16,64,执行结果:,例6-22:列表的查找、排序和反转,2023/1/16,65,执行结果:,例6-23:用列表实现堆栈(“后进先出”的线性表),2023/1/16,66,执行结果:,例6-24:用列表实现队列,2023/1/16,67,执行结果:,例6-25:列表应用,某学校组织了一场校园歌手比赛,每个歌手的得分由10名评委和观众决定,最终得分的规则是去掉10名评委所打分数的一个最高分和一个最低分,再加上所有观众评委分数后的平均值。评委打出的10个分数为:9、9、8.5、10、7、8、8、9、8和10,观众评委打出的综合评分为9,请计算该歌手的最终得分。,2023/1/16,68,C+源程序:,2023/1/16,69,2023/1/16,70,课堂练习二:,课堂练习二,2023/1/16,71,4、列表解析,列表的用途如此之多,以至于Python提供了一种用于创建列表的特殊方法列表解析。列表解析的特点为:动态创建列表 简单灵活有用 expression for expr in sequence1 for expr2 in sequence2.for exprN in sequenceN if condition,2023/1/16,72,例6-26:用普通方法和列表解析方法分别创建一个由110的平方组成的列表,2023/1/16,73,执行结果:,例6-27:将列表中的每个数字翻倍并加上7,2023/1/16,74,执行结果:,例6-28:在列表解析中使用字符串,2023/1/16,75,执行结果:,例6-29:利用列表解析修改现有列表,2023/1/16,76,执行结果:,例6-30:返回列表中的正数(利用列表解析进行筛选),2023/1/16,77,执行结果:,例6-31:利用列表解析删除字符串中的所有元音,2023/1/16,78,执行结果:,5、函数作为列表的元素,用函数作为参数与列表一起使用非常有用,也称为高阶编程。例6-32:假定L是一个列表,f是一个函数,用函数替换每个元素改变列表,即用f(e)改变L中的元素e。,2023/1/16,79,2023/1/16,80,执行结果:,课堂练习三:,课堂练习三,2023/1/16,81,2023/1/16,82,五、元组,元组是一种不可变序列,即创建之后不能再做任何修改。元组由不同的元素组成,每个元素可以存储不同类型的数据,如字符串、数字甚至元组。元组通常代表一行数据,而元组中的元素代表不同的数据项。,2023/1/16,83,1、元组的创建,格式:tuple=(元素1,元素2,元素n)#定义n个元素组成的元组 tuple=()#定义空元组 tuple=(元素1,)#定义单元素元组说明:元组用圆括号括起(也可以不加圆括号),其中元素用逗号分隔。,2023/1/16,84,2023/1/16,85,2023/1/16,86,2023/1/16,87,2、元组常用方法,2023/1/16,88,说明:所有适用于序列的函数均适用于元组。,例6-33:元组方法应用,2023/1/16,89,执行结果:,2023/1/16,90,3、元组用途,在映射类型中当作键使用函数的特殊类型参数作为很多内建函数的返回值,2023/1/16,91,课堂练习四:,课堂练习四,2023/1/16,92,六、字典,字典是Python重要的数据类型,字典是由“键值”对组成的集合,字典中的“值”通过“键”来引用。字典也称为关联数组、映射或散列表。Python字典利用了“散列”方法,使用专门的散列函数完成,即字典中的每个键都被转换为一个数字散列值。字典中值存储在一个底层列表中,并用散列值作为索引。访问值时,将提供的键转为散列值,再跳到列表的相应位置。使用“键”来访问字典值效率极高。另外与列表一样,字典也是可以改变的:可以添加、删除或修改“键值”对。,2023/1/16,93,1、创建字典,格式:dictionary=key1:value1,key2:value2,keyn:valuen)#创建n个“键值”对组成的字典 dictionar=#创建空字典注意,对于字典的键有两个限制:字典中的键必须独一无二,即在同一个字典中,任何两个键值对都不能相同;键必须是不可变的。因此,字典键不能是列表、字典对值没有这两个限制。,2023/1/16,94,2、字典的访问,字典的访问与元组、列表有所不同,元组和列表是通过数字索引获取对应的值,而字典是通过key值获取相应的value值。格式:value=dictkey说明:字典的添加、删除和修改只需执行一条赋值语句即可,例如:dictx=value字典没有remove操作。删除字典元素可调用内置函数del()完成。,2023/1/16,95,例6-34:字典的创建、添加、删除和修改,2023/1/16,96,执行结果:,3、字典常用方法,2023/1/16,97,说明:,popitem()返回并删除字典的某个键值对,具体是哪个预先并不知道,因此仅当不在乎字典元素的顺序时,此函数才适用。item()、keys()和values()都返回一个特殊对象视图。视图被链接到原始字典,因此若字典发生变化,视图也将相应地变化。,2023/1/16,98,例6-35:字典函数应用一,2023/1/16,99,执行结果:,2023/1/16,100,例6-36:字典函数应用二,2023/1/16,101,4、字典的排序和复制,字典的排序可以使用内置函数sorted()实现。sorted(iterable,key=None,reverse=False)-new sorted list,2023/1/16,102,例6-37:字典排序,2023/1/16,103,关于复制,复制分为深拷贝和浅拷贝,不只限于字典,适用于Python的任何对象。可使用copy模块来实现对象的深拷贝和浅拷贝,deepcopy()用于深拷贝,copy()用于浅拷贝。深拷贝能够拷贝对象内部所有数据和引用,引用相当于C语言中指针的概念,Python并不存在指针,但是变量的内存结构中通过引用来维护变量。浅拷贝只是复制数据,并没有复制数据的引用,新的数据和旧的数据使用同一块内存空间。,2023/1/16,104,例如:,字典B浅拷贝字典A的数据,如果字典B的数据发生添加、删除或修改操作,字典A的数据也将发生变化;相反,如果字典B深拷贝字典A的数据,字典B的数据即使发生变化,也不会影响的字典A。,2023/1/16,105,例6-36:字典的拷贝,2023/1/16,106,执行结果:,课堂练习五:,课堂练习五,2023/1/16,107,七、集合,在Python中,集合是一系列不重复的元素。集合类似于字典,但只包含键,而没有相关联的值。在Python中,集合是相对较新的功能,在其还不支持集合时,一般使用字典模拟集合。集合分两类:可变集合(set)和不可变集合(frozenset)。对于可变集合,可添加和删除元素,而不可变集合一旦创建就不能更改。与字典一样,集合的元素排列顺序也是不确定的。集合没有列表和字典用得多,本章简要介绍,详细内容可参阅:https:/docs.python.org/3/library/stdtypes.html#set,2023/1/16,108,1、集合基本功能,包括关系测试和消除重复元素。集合对象还支持 union(联合),intersection(交),difference(差)和 sysmmetric difference(对称差集,即异或)等数学运算。大括号或 set()函数可以用来创建集合。注意:想要创建空集合,必须使用 set()而不是。,2023/1/16,109,1、集合的创建,2023/1/16,110,2、集合比较,2023/1/16,111,3、集合关系运算,2023/1/16,112,4、集合的方法(面向所有集合),2023/1/16,113,5、集合的方法(面向可变集合),2023/1/16,114,