当前位置:   article > 正文

【浙大版《Python 程序设计》题目集(解)】第7章-1 词频统计(30分)_浙江大学pta答案python第七章

浙江大学pta答案python第七章

请编写程序,对一段英文文本,统计其中所有不同单词的个数,以及词频最大的前10%的单词。

所谓“单词”,是指由不超过80个单词字符组成的连续字符串,但长度超过15的单词将只截取保留前15个单词字符。而合法的“单词字符”为大小写字母、数字和下划线,其它字符均认为是单词分隔符。

输入格式:

输入给出一段非空文本,最后以符号#结尾。输入保证存在至少10个不同的单词。

输出格式:

在第一行中输出文本中所有不同单词的个数。注意“单词”不区分英文大小写,例如“PAT”和“pat”被认为是同一个单词。

随后按照词频递减的顺序,按照词频:单词的格式输出词频最大的前10%的单词。若有并列,则按递增字典序输出。

输入样例:

  1. This is a test.
  2. The word "this" is the word with the highest frequency.
  3. Longlonglonglongword should be cut off, so is considered as the same as longlonglonglonee. But this_8 is different than this, and this, and this...#
  4. this line should be ignored.

输出样例:(注意:虽然单词the也出现了4次,但因为我们只要输出前10%(即23个单词中的前2个)单词,而按照字母序,the排第3位,所以不输出。)

  1. 23
  2. 5:this
  3. 4:is

解析:

先把非“合法单词”过滤掉,用空格作为间隔,因为不区分大小写,所以要把所有的“合法单词”全都转换为小写并拆分成列表,使用字典去统计列表里的单词,统计完成后使用sorted()函数进行排序,排序规则为把字典的键和值作为一个项,根据值的大小进行降序(key=lambda x: (-x[1], x[0])),最后只需根据条件打印显示出结果就行了

解题:

  1. import sys # 引用sys模块
  2. s = sys.stdin.read() # 读取键盘输入的所有内容,Windows以Ctrl+D结束输入
  3. strs = s[:s.find('#')] # “以符号#结尾”,截取”#“前面的所有内容
  4. for k in set([i for i in strs if i.isalnum() is False and i != '_']): # isalnum() 方法检测字符串是否由字母和数字组成
  5. strs = strs.replace(k, ' ') # 其他字符均认为是单词分隔符 # 把提取出的东西去掉
  6. strs = strs.lower().split() # 全部变小写同时进行拆分
  7. counts = dict() # 创建一个counts字典用于统计保存单词个数
  8. # 统计单词数
  9. for i in strs:
  10. k = i[:15] # 直接截取,长度小于15的不受影响,大于15的只保留前15个字母
  11. counts[k] = counts.get(k, 0) + 1 # 统计单词,键不存在则返回 0 加一,存在则返回相应的数值加一
  12. # 词频递减的顺序,若有并列,则按递增字典序
  13. ans = sorted(counts.items(), key=lambda x: (-x[1], x[0])) # items()把字典里的每一项(k:v)当作一个元素,0位上是键,1位上是值,-x[1]表示更具数值降序
  14. # 打印结果
  15. print(len(counts)) # 打印总单词数
  16. for i in ans[:len(ans) // 10]: # 词频最大的前10%的单词
  17. print(i[1], i[0], sep=':') # sep表示前n项元素用sep的值作为间隔

如有更好的建议请评论!!!

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号