【问题描述】
有若干个用空格分隔的英语单词,请你编写程序统计出现次数超过两次的单词及其出现次数。假设单词中只含有大小写英文字母,各单词之间只用若干个空格分隔。
输入数据:
Python is simple to use but it is a real programming language offering much more structure and support for large programs than shell scripts or batch files can offer On the other hand Python also offers much more error checking than C and being a very high level language it has high level data types built in such as flexible arrays and dictionaries Because of its more general data types Python is applicable to a much larger problem domain than Awk or even Perl yet many things are at least as easy in Python as in those languages
输出结果:
(python:4),(is:3),(a:3),(much:3),(more:3),(and:3),(than:3),(in:3),(as:3)
【题前思考】
根据问题描述,填写表4-2-1。
表4-2-1 问题分析
【解题思路】
首先使用字符串的split( )方法将字符串按空格切割构成列表,随后将列表中的单词全部转换为小写。使用字典统计各单词出现的次数,统计的目标是单词,所以以单词为键,以次数为值。对列表中的每一个单词,如果单词在字典中存在,就将字典中记录的单词个数的值加1;如果不存在,就以这个单词为键添加到字典中,将其值设为1,表示这个单词出现了1次。
【程序代码】
【代码分析】
①:使用列表推导式取得文章中的单词列表。
text.split( ):用空格切割text,保留空格间的字符串,连续空格切割出空串。
...batch files can offer On the other hand Python...
word:切割得到的列表,每一个元素用变量word迭代。
batch,files,can,offer,,,On,the,other,hand,Python
word.lower( ):将变量word中的每个字母变成小写。
batch,files,can,offer,,,on,the,other,hand,python
②:定义一个空的字典wordNum(以单词为键、次数为值)来保存单词出现次数。
③:使用字典统计单词个数。表达式word in wordNum成立表示这个单词在字典中存在,那么这个词对应的个数就应该加1(wordNum[word]+=1);反之,就应该在字典中为新词创建一个项目,其键就是这个新单词,值为1(第1次出现这个词)。
④:使用列表推导式产生结果列表。
wordNum.items( ):将每一个项变成元组,元组的第一个元素是键,第二个元素是值,再组成一个列表。
for word,num in wordNum.items( )将wordNum.items( )列表中的每一个元素拆分成两个变量word和num,如('python',4)就拆成了'python',4两个变量。
if len(word)>0 and num>2:筛选长度大于0且出现次数大于2的元素。
f"({word}:{num})":对数据进行格式化,重新构成一个列表,字符串前的f表示需要将其中{}括起来的表达式转换成字符串。
【优化提升】
字典的用途很广,统计单词个数只是一个小应用,并非其长项。如果仅仅是统计数量,collections包中的Counter类可以提供更为便捷的方法。如果单词已处理好并放到列表words中,可以用如下代码实现以上相同功能。
from collections import Counter
print([x for x in Counter(words).items( )if len(x[0])>0 and x[1]>2])
Counter(words).items( )会得到一个可迭代的dict_items对象,该对象的元素为二元组(键,值),具体到此例就为(单词,数量)。
【技术全貌】
Python中的字典类型提供了很多存储和操作映射数据的方法,表4-2-2中仅列出了其中常见的方法,全部方法及其说明请扫描二维码查阅官网文档。
表4-2-2 字典方法
续表
注:由dict对象和Counter对象的 keys( ),values( ) 和 items( ) 所返回的对象都是视图对象。 该对象提供字典条目的一个动态视图,这意味着当字典改变时,视图也会相应改变。字典视图可以被迭代以产生与其对应的数据(for ... in),并支持成员检测(in和not in)。