Python 3.6零基础入门与实战
上QQ阅读APP看书,第一时间看更新

2.10 数据结构实战:文本统计分析

本节将使用本章前面介绍的各种数据结构实现一个简单的例子:对两个英文文档进行统计,得到两个英文文档使用了多少单词、每个单词的使用频率,并且对两个文档进行比较,返回有差异的行号和内容。

本节要实现的程序取名为PyMerge,它需要实现两个功能模块:统计和比较。

• 统计功能:主要是统计总词汇数和每个词汇的数目。

可以将每个词汇作为key保存到字典中,对文本从开始到结束循环处理每个词汇,并将它的value设置为1,如果已经存在该词汇的key,说明该词汇已经使用过,就将它的value累加1。

• 比较功能:主要是比较两个文本的差异,需要忽略空行和空格的影响,也就是因为多个空行或空格产生的文本差异不应该列为文本差异。

在实现这个功能的时候,首先要将文本分成一行一行的,对每一行进行处理,忽略空格的个数,将字符串里有效字符转换成列表,然后进行比较。

统计功能是将词汇放到字典类型中,用字典的key存放单词,用value存放个数。

2.10.1 文本统计功能

统计功能是将一个文本的每个字符作为key值放入字典中,以下代码实现了文本词汇数的统计。

第06行代码,对文本字符串readtxt做split操作,就可以获得该文本字符串的所有词汇,每个词汇都作为列表的元素返回。第08~12行代码循环处理词汇列表,将词汇作为dict的key,如果key已经存在,则它的value值累加1,否则将value设置为1。

上面实现的文本统计的代码需要封装起来给整个程序使用,可以使用函数封装,使用语法定义def functionname():函数就可以了,具体的函数在后面的章节会介绍,这里直接使用。封装代码如下:

2.10.2 文本比较功能

文本比较首先需要将文本字符串分成一行一行的,使用字符串splitlines方法将一个字符串按行分成一个列表,对分成的列表删除空元素和空白字符元素,最后将两个文本进行循环比较。以下代码实现了文本比较功能:

代码的实现逻辑主要包括:

• 第03~04行,对两个文本按行划分。

• 第05~06行,一个列表推导式操作,作用是去掉空行和只有空白字符的行。

• 第11~12行,将文本每一行转换成列表,转换过程中忽略空白字符。

• 第13~14行,比较的结果如果不相等,就写信息到return_li,以供函数返回信息。

• 第16~20行,两个文本行数不一致时,将多出来的行的文本信息写到return_li,以供函数返回。

本节的例子并不完善,还没有实现文件读取功能等更复杂的技术。这里只是演示一下前面讲解的一些数据结构的使用,等读者全部学完本书内容后,可以继续完善这个例子。