收藏 分享(赏)

Python电子教案6-2 组合数据类型.ppt

上传人:精品资料 文档编号:10211402 上传时间:2019-10-20 格式:PPT 页数:54 大小:914.50KB
下载 相关 举报
Python电子教案6-2 组合数据类型.ppt_第1页
第1页 / 共54页
Python电子教案6-2 组合数据类型.ppt_第2页
第2页 / 共54页
Python电子教案6-2 组合数据类型.ppt_第3页
第3页 / 共54页
Python电子教案6-2 组合数据类型.ppt_第4页
第4页 / 共54页
Python电子教案6-2 组合数据类型.ppt_第5页
第5页 / 共54页
点击查看更多>>
资源描述

1、第6节: 组合数据类型,字典类型的计算,列表是存储和检索数据的有序序列。当访问列表中元素时,可以通过整数的索引来查找它,这个索引是元素在列表中的序号,列表的索引模式是“查找”。很多应用程序需要更灵活的信息查找方式,例如,在检索学生或员工信息时,需要基于身份证号码进行查找,而不是信息存储的序号。在编程术语中,根据一个信息查找另一个信息的方式构成了“键值对”,它表示索引用的键和对应的值构成的成对关系,即通过一个特定的键(身份证号码)来访问值(学生信息)。实际应用中有很多“键值对”的例子,例如:姓名和电话号码、用户名和密码、邮政编码和运输成本、国家名称和首都等。由于键不是序号,无法使用列表类型进行有

2、效存储和索引。,字典类型的基本概念,通过任意键信息查找一组数据中值信息的过程叫映射,Python语言中通过字典实现映射。Python语言中的字典可以通过大括号()建立,建立模式如下: :, :, , : 其中,键和值通过冒号连接,不同键值对通过逗号隔开。 从Python设计角度考虑,由于大括号可以表示集合,所以,字典类型也具有和集合类似的性质,即键值对之间没有顺序且不能重复。简单说,可以把字典看成元素是键值对的集合。下面是一个简单的字典,它存储国家和首都的键值对:,字典类型的基本概念,注意到,字典打印出来的顺序与创建之初的顺序不同,这不是错误。字典是集合类型的延续,所以各个元素并没有顺序之分。

3、如果想保持一个集合中元素的顺序,需要使用列表,而不是字典。,字典类型的基本概念,字典最主要的用法是查找与特定键相对应的值,这通过索引符号来实现。 Dcountry“中国“北京 一般来说,字典中键值对的访问模式如下,采用中括号格式:= ,字典类型的基本概念,字典中对某个键值的修改可以通过中括号的访问和赋值实现,例如:Dcountry“中国“=大北京print(Dcountry)中国: 大北京, 法国: 巴黎, 美国: 华盛顿总结起来,字典是存储可变数量键值对的数据结构,键和值可以是任意数据类型,包括程序自定义的类。,字典类型的基本概念,与列表相似,Python字典也有非常灵活的操作方法。使用大括

4、号可以创建字典,并指定初始值。通过中括号可以增加新的元素,字典类型的基本概念,直接使用大括号()可以创建一个空的字典,并通过中括号()向其增加元素,例如:,字典类型的基本概念,需要注意,尽管集合类型也用大括号表示,直接使用大括号()生成一个空的字典,而不是集合。生成空集合需要使用函数set()。 字典在Python内部也采用面向对象方式实现,因此也有一些对应的方法,采用.()格式,此外,还有一些函数能够用于操作字典,这些函数和方法如表6.5所示。,字典类型的基本概念,字典类型的基本概念,上述方法的一些例子如下,如果希望keys()、values()和items()方法返回列表类型,可以采用li

5、st()函数将返回值转换成列表。,字典类型的基本概念,与其他组合类型一样,字典可以通过forin语句对其元素进行遍历,基本语法结构如下: for in : 语句块 由于键值对中的键相当于索引,所以,for循环返回的变量名是字典的索引值。如果需要获得键对应的值,可以在语句块中通过get()方法获得。,字典类型的基本概念,字典是实现键值对映射的数据结构,它采用任意类型的键数据作为索引,十分灵活,具有处理任意长度、混合类型键值对的能力。为了更好地认识和使用字典,请理解如下一些基本原则: 字典是一个键值对的集合,该集合以键为索引,一个键信息只对应一个值信息 字典中元素以键信息为索引访问; 字典长度是可

6、变的,可以通过对键信息赋值实现增加或修改键值对。,字典类型的基本概念,jieba库的使用,对于一段英文文本,例如“China is a great country“,如果希望提取其中单词,只需要使用字符串处理的split()方法即可,如下:,jieba库的概述,然而,对于一段中文文本,例如“中国是一个伟大的国家“,希望获得其中的单词(不是字符)则十分困难,因为英文文本可以通过空格或者标点符号分割,而中文单词之间缺少分隔符,这是中文及类似语言独有的“分词”问题。上例中,分词能够将“中国是一个伟大的国家“分为“中国“、“是“、“一个“、“伟大“、“的“、“国家“等一系列词语。,jieba库的概述,

7、jieba(“结巴”)是Python中一个重要的第三方中文分词函数库,例子如下。 import jieba jieba.lcut(“中国是一个伟大的国家“) 中国, 是, 一个, 伟大, 的, 国家jieba库是第三方库,不是安装包自带,因此,需要通过pip指令安装,具体安装方法请参考8.6节。pip安装命令如下:,jieba库的概述,jieba库的分词原理是利用一个中文词库,将待分词的内容与分词词库进行比对,通过图结构和动态规划方法找到最大概率的词组。除了分词,jieba还提供增加自定义中文单词的功能。jieba库支持三种分词模式:精确模式,将句子最精确地切开,适合文本分析;全模式,把句子中

8、所有可以成词的词语都扫描出来,速度非常快,但是不能解决歧义;搜索引擎模式,在精确模式基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。,jieba库的概述,jieba库主要提供分词功能,可以辅助自定义分词词典。jieba库中包含的主要函数如表 所示,jieba库的解析,针对上述分词函数,举例如下: import jieba jieba.lcut(“中华人民共和国是一个伟大的国家“) 中华人民共和国, 是, 一个, 伟大, 的, 国家 jieba.lcut(“中华人民共和国是一个伟大的国家“, cut_all=True) 中华, 中华人民, 中华人民共和国, 华人, 人民, 人民共和国,

9、 共和, 共和国, 国是, 一个, 伟大, 的, 国家 jieba.lcut_for_search(“中华人民共和国是一个伟大的国家“) 中华, 华人, 人民, 共和, 共和国, 中华人民共和国, 是, 一个, 伟大, 的, 国家,jieba库的解析,jieba.lcut()函数返回精确模式,输出的分词能够完整且不多余的组成原始文本;jieba.lcut(,True)函数返回全模式,输出原始文本中可能产生的所有问题,冗余性最大;jieba.lcut_for_search()函数返回搜索引擎模式,该模式首先执行精确模式,然后再对其中长词进一步切分获得结果。由于列表类型通用且灵活,建议读者使用上述

10、三个能够返回列表类型的分词函数。,jieba库的解析,默认情况下,表6.6中jieba.cut()等6个分词函数能够较高概率识别自定义的新词,比如名字或缩写,例如,下例中本书作者的姓名不在词典中,但分词函数能够根据中文字符间的相关性识别为一个词。对于无法识别的分词,也可以通过jieba.add_word()函数向分词库添加,例子如下。,jieba库的解析,import jieba jieba.lcut(“嵩天老师在努力教学Python语言“) 嵩天, 老师, 在, 努力, 教学, Python, 语言 jieba.lcut(“习大大期盼有更好的教育“) 习, 大大, 期盼, 有, 更好, 的,

11、 教育 jieba.add_word(“习大大“) jieba.lcut(“习大大期盼有更好的教育“) 习大大, 期盼, 有, 更好, 的, 教育,jieba库的解析,文本词频统计,在很多情况下,会遇到这样的问题:对于一篇给定文章,希望统计其中多次出现的词语,进而概要分析文章的内容。这个问题的解决可用于对网络信息进行自动检索和归档。在信息爆炸时代,这种归档或分类十分有必要。这就是“词频统计”问题。 从思路上看,词频统计只是累加问题,即对文档中每个词设计一个计数器,词语每出现一次,相关计数器加1。如果以词语为键,计数器为值,构成:的键值对,将很好地解决该问题。这就是字典类型的优势。,文本词频统计

12、,下面,采用字典来解决词频统计问题。该问题的IPO描述如下: 输入:从文件中读取一篇文章 处理:采用字典数据结构统计词语出现频率 输出:输出文章中最常出现的10个单词及出现次数英文文本以空格或标点符号来分割词语,获得单词并统计数量相对容易,6.6.1节介绍统计英文文本词频的方法。中文字符之间没有天然的分隔符,需要对中文文本进行分词,6.6.2节介绍统计中文文本词频方法。,文本词频统计,Hamlet,哈姆雷特,是莎士比亚的一部经典悲剧作品,讲述了克劳狄斯叔叔谋害哈姆雷特父亲并篡取王位、哈姆雷特流浪在外并向叔叔复仇的故事。哈姆雷特也叫王子复仇记,代表着整个西方文艺复兴时期文学的最高成就,很多国内外

13、电影都以这个故事为原型。 获取该故事的文本文件,保存为hamlet.txt。全文可以从网络上找到,或从本书提供的电子资源中获取。,文本词频统计,统计Hamlet英文词频的第一步是分解并提取英文文章的单词。同一个单词会存在大小写不同形式,但计数却不能区分大小写。假设Hamlet文本由变量txt表示,可以通过txt.lower()函数将字母变成小写,排除原文大小写差异对词频统计的干扰。英文单词的分割可以是空格、标点符号或者特殊符号。为统一分隔方式,可以将各种特殊字符和标点符号使用txt. replace()方法替换成空格,再提取单词。统计词频的第二步是对每个单词进行计数。假设将单词保存在变量wor

14、d中,使用一个字典类型counts=,统计单词出现的次数可采用如下代码 countsword = countsword + 1,文本词频统计,当遇到一个新词时,单词没有出现在字典结构中,则需要在字典中新建键值对: countsnew_word = 1 因此,无论词是否在字典中,加入字典counts中的处理逻辑可以统一表示为: if word in counts:countsword = countsword + 1 else:countsword = 1 或者,这个处理逻辑可以更简洁的表示为如下代码: countsword = counts.get(word,0) + 1,文本词频统计,字典类

15、型的counts.get(word,0)方法表示:如果word在counts中,则返回word对应的值,如果word不在counts中,则返回0。 该实例的第三步是对单词的统计值从高到低进行排序,输出前10个高频词语,并格式化打印输出。由于字典类型没有顺序,需要将其转换为有顺序的列表类型,再使用sort()方法和lambda函数配合实现根据单词次数对元素进行排序。最后输出排序结果前10位的单词。 items = list(counts.items() #将字典转换为记录列表 items.sort(key=lambda x:x1, reverse=True)#以记录第2列排序,文本词频统计,采用

16、函数对获取和整理文本进行封装,下面给出该实例的完整代码。,文本词频统计,运行程序后,输出结果如右:,观察输出结果可以看到,高频单词大多数是冠词、代词、连接词等语法型词汇,并不能代表文章的含义。进一步,可以采用集合类型构建一个排除词汇库excludes,在输出结果中排除这个词汇库中内容,具备这样功能程序的完整代码如下。,文本词频统计,文本词频统计,运行程序后,输出结果如下,文本词频统计,三国演义是中国古典四大名著之一,作者是元末明初的小说家罗贯中。该书描写了从东汉末年到西晋初年之间近105年的历史风云,以描写战争为主,反映了东汉末年的群雄割据混战和魏、蜀、吴三国之间的政治和军事斗争。 三国演义是

17、一本鸿篇巨著,里面出现了几百个各具特色的人物。每次读这本经典作品都会想一个问题,全书这些人物谁出场最多呢?一起来用Python回答这个问题吧。 人物出场统计涉及对词汇的统计。中文文章需要分词才能进行词频统计,这需要用到jieba库。分词后的词频统计方法与Hamlet的英文词频统计方法类似。,三国演义人物出场统计,三国演义文本保存为:三国演义.txt。实现代码如下:,三国演义人物出场统计,先输出排序前15的单词,运行程序后,输出结果如下:,三国演义人物出场统计,观察输出结果,似乎“曹操”是出场次数最多的人。然而,结果中出现了“玄德”、“玄德曰”,读者应该知道“玄德”的名字就是“刘备”。同一个人物

18、会有不同的名字,这种情况需要整合处理。同时,与英文词频统计类似,需要排除一些人名无关词汇,如“却说”、“将军”等。进一步完善代码如下,其中,第3行增加了排除词库excludes,第10到17行增加了同一人物不同名字的处理。,三国演义人物出场统计,三国演义人物出场统计,三国演义人物出场统计,输出排序前5的单词,运行程序后,输出结果如下: 曹操 1451孔明 1383刘备 1252关羽 784张飞 358,三国演义人物出场统计,请感兴趣的读者可以继续完善程序,排除更多无关词汇干扰,总结出场最多的20个人物都有哪些。这里,给出参考答案。曹操(1451)、孔明(1383)、刘备(1252)、关羽(78

19、4)、张飞(358) 吕布(300)、赵云(278)、孙权(264)、司马懿(221)、周瑜(217) 袁绍(191)、马超(185)、魏延(180)、黄忠(168)、姜维(151) 马岱(127)、庞德(122)、孟获(122)、刘表(120)、夏侯惇(116),三国演义人物出场统计,Python之禅,什么样的程序是好的?如何编写漂亮的代码?这都是学习编程一段时间最经常提出的问题,却最难回答。程序设计语言如同自然语言,好的代码就像文学作品,不仅达意,更要优美。那什么是“好”?什么是“优美”?领悟编程代码优美的过程类似参禅,除了不断练习,也需要理解一些原则。,Python之禅,Python编译

20、器以函数库的形式内置了一个有趣的文件,被称为“Python之禅”(The Zen of Python)。当调用如下一行语句后,会出现一段有趣的运行结果。import this,Python之禅,Python之禅,除了Python之禅所表达的Python设计理念,该程序还有另一段魅力。请读者在Python安装目录中找到Lib/this.py文件,该程序内容如下:,Python之禅,Python之禅,该程序第1到23行是一个字符串s,但字符串并非是明文。将s转换成内容的代码从25行到30行。在这些代码中,可以看到字典、列表和元组类型,下面逐行来阅读这个代码的功能。第24行定义了一个空字典d,第26

21、行对字典d填充了内容,这个填充将i+c对应的字符替换为(i+13)%26 +c,即将编号循环增加了13。chr(65)代表字符A,chr(97)代表字符a,因此,第24到27行建立了字母a到z和字母A到Z的一个13位循环移动的对应表,如下所示:,Python之禅,密文:A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 原文:N O P Q R S T U V W X Y Z A B C D E F G H I J K L M 密文:a b c d e f g h i j k l m n o p q r s t u v w x y z 原文:n o p q r s t u v w x y z a b c d e f g h i j k l m,Python之禅,这个算法可以看作是3.5节介绍的凯撒密码的一种扩展,相比凯撒密码,这个算法采用循环移动13个位置,直接好处是原文和密文之间的相互转换可以使用同一个程序,建议读者掌握这个算法,传递个小纸条、发个小消息就不怕被别人看懂了。,Python之禅,本章主要介绍了组合数据类型中元组、数组、列表和字典等类型及基本操作,讲解了如何使用jieba词库对中文文档进行分词并进一步统计文档词频,最后利用Python之禅例子介绍编写好代码的基本原则。,本章小结,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报