赞
踩
请编写程序,对一段英文文本,统计其中所有不同单词的个数,以及词频最大的前10%的单词。
所谓“单词”,是指由不超过80个单词字符组成的连续字符串,但长度超过15的单词将只截取保留前15个单词字符。而合法的“单词字符”为大小写字母、数字和下划线,其它字符均认为是单词分隔符。
输入给出一段非空文本,最后以符号#
结尾。输入保证存在至少10个不同的单词。
在第一行中输出文本中所有不同单词的个数。注意“单词”不区分英文大小写,例如“PAT”和“pat”被认为是同一个单词。
随后按照词频递减的顺序,按照词频:单词
的格式输出词频最大的前10%的单词。若有并列,则按递增字典序输出。
- This is a test.
-
- The word "this" is the word with the highest frequency.
-
- Longlonglonglongword should be cut off, so is considered as the same as longlonglonglonee. But this_8 is different than this, and this, and this...#
- this line should be ignored.
the
也出现了4次,但因为我们只要输出前10%(即23个单词中的前2个)单词,而按照字母序,the
排第3位,所以不输出。)- 23
- 5:this
- 4:is
先把非“合法单词”过滤掉,用空格作为间隔,因为不区分大小写,所以要把所有的“合法单词”全都转换为小写并拆分成列表,使用字典去统计列表里的单词,统计完成后使用sorted()函数进行排序,排序规则为把字典的键和值作为一个项,根据值的大小进行降序(key=lambda x: (-x[1], x[0])),最后只需根据条件打印显示出结果就行了
- import sys # 引用sys模块
-
-
- s = sys.stdin.read() # 读取键盘输入的所有内容,Windows以Ctrl+D结束输入
- strs = s[:s.find('#')] # “以符号#结尾”,截取”#“前面的所有内容
-
- for k in set([i for i in strs if i.isalnum() is False and i != '_']): # isalnum() 方法检测字符串是否由字母和数字组成
- strs = strs.replace(k, ' ') # 其他字符均认为是单词分隔符 # 把提取出的东西去掉
-
- strs = strs.lower().split() # 全部变小写同时进行拆分
-
- counts = dict() # 创建一个counts字典用于统计保存单词个数
-
- # 统计单词数
- for i in strs:
- k = i[:15] # 直接截取,长度小于15的不受影响,大于15的只保留前15个字母
- counts[k] = counts.get(k, 0) + 1 # 统计单词,键不存在则返回 0 加一,存在则返回相应的数值加一
-
- # 词频递减的顺序,若有并列,则按递增字典序
- ans = sorted(counts.items(), key=lambda x: (-x[1], x[0])) # items()把字典里的每一项(k:v)当作一个元素,0位上是键,1位上是值,-x[1]表示更具数值降序
- # 打印结果
- print(len(counts)) # 打印总单词数
- for i in ans[:len(ans) // 10]: # 词频最大的前10%的单词
- print(i[1], i[0], sep=':') # sep表示前n项元素用sep的值作为间隔
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。