【PTA-python】第7章-1 词频统计 (30 分)--sys.stdin.read()读入到特定字符截至,双重排序条件key=lambda item:(-item[1], item[0])
第7章-1 词频统计
分析
遇到含有回车的无效输入,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]))
浙公网安备 33010602011771号