【PTA-python】第7章-1 词频统计 (30 分)--sys.stdin.read()读入到特定字符截至,双重排序条件key=lambda item:(-item[1], item[0])

分析

遇到含有回车的无效输入,while循环如何处理。同过input()字符串不断串联起来。
字符串思想,读入所有内容到一个串内。
关于并列情况的字典序输出。

双重排序条件:字典序,数字降序

list=sorted(counts.items(), key=lambda item:(-item[1], item[0]))
#按item第一位的倒序,也即数字的倒序,第零位的正序,也即单词的字典序排序

题目

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

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

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

输出格式:

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

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

解法

自解

在这里插入图片描述

s=""
while(True):
    s+=input()
    if "#" in s:
        break
s=s.replace(",","").replace("."," ").replace('"','').replace("#","")
lst=s.split()
for i in range(len(lst)):
    lst[i]=lst[i][:15].lower()
count={}
for i in lst:
    count[i]=count.get(i,0)+1
list=sorted(count.items(),key=lambda item:(-item[1],item[0]))
print(len(list))
for i in range(int(len(list)*0.1)):
    print("{}:{}".format(list[i][1],list[i][0]))

判断应该是字符过滤存在问题,如果#在中间而不是在一个回车换行之前,那么#之后的字符还会被添加到s中,而不能被过滤掉

参考代码截断到#输入的代码

import sys
s=sys.stdin.read()
s=s[:s.find("#")]#通过指针定位,找到输入中#字符出现的位置,并截断到此处
#构建一个输入的字符串中所有非数字、字母、下划线的字符的集合
t=set([i if i.isalnum()==False and i!='_' else " " for i in s ])
for i in t:
    #将字符串中所有非法字符替换为空格
    s=s.replace(i," ")

完整代码

import sys
s=sys.stdin.read()
s=s[:s.find("#")]
t=set([i if i.isalnum()==False and i!='_' else " " for i in s ])
for i in t:
    #将字符串中所有非法字符替换为空格
    s=s.replace(i," ")
lst=s.split()
for i in range(len(lst)):
    lst[i]=lst[i][:15].lower()
count={}
for i in lst:
    count[i]=count.get(i,0)+1
list=sorted(count.items(),key=lambda item:(-item[1],item[0]))
print(len(list))
for i in range(int(len(list)*0.1)):
    print("{}:{}".format(list[i][1],list[i][0]))
posted @ 2021-04-23 20:21  flybird2008  阅读(31)  评论(0)    收藏  举报  来源