7-1词频统计
请编写程序对一段英文文本统计其中所有不同单词的个数以及词频最大的前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位所以不输出。235:this4:is本题对现在正在学习练习python的人来说难度很大花费时间最长好在终于攻克。先直接展示正确代码text while True: ninput() if # in n: textn[:n.index(#)] break else: textn def danci(m): return m.isalpha() or m.isdigit() or m_ p[] i0 slen(text) while is: if not danci(text[i]): i1 continue starti while is and danci(text[i]): i1 atext[start:i].lower() if len(a)15: aa[:15] p.append(a) f{} for w in p: f[w]f.get(w,0)1 Slen(f) print(S) KS//10 g{} for x,y in f.items(): g.setdefault(y,[]).append(x) result[] for y in sorted(g,reverseTrue): wordsorted(g[y]) if len(result)len(word)K: result.extend([(y,x)for x in word]) else: result.extend([(y,x)for x in word[:K-len(result)]]) break for x,y in result: print(f{x}:{y})line.index(#)line字符串变量存储了当前行的内容.index()字符串方法用于查找子串的位置#要查找的字符返回值返回#在字符串中的索引位置从0开始计数到最后还是有两个测试点错误分析得出单词提取时text拼接导致单词粘连所以在textn后加入了 此处有空格。因为观察输出是23个单词但只取前两位所以就直接S//10进行了向下取整。第一个print的作用是为了输出单词个数后面代码的作用是将单词按词频分组然后按词频从高到低输出直到凑够K个单词。方法代码位置具体作用.index()n[:n.index(#)]找到#的位置用于截取#前的内容.lower()a text[start:i].lower()将单词转为小写实现不区分大小写.isalpha()m.isalpha()判断字符是否为字母单词字符之一.isdigit()m.isdigit()判断字符是否为数字单词字符之一.get()f.get(w, 0)安全获取单词当前次数不存在返回0.setdefault()g.setdefault(y, [])按词频分组不存在则创建空列表.items()for x,y in f.items()遍历词频字典的键值对.append()p.append(a)将提取的单词添加到列表.extend()result.extend([...])将多个元组添加到结果列表字符串方法方法作用示例返回值.lower()将所有字母转换为小写Hello.lower()hello.upper()将所有字母转换为大写Hello.upper()HELLO.index(sub)返回子串第一次出现的索引hello#world.index(#)5.find(sub)返回子串索引找不到返回-1hello.find(z)-1.isalpha()判断是否全是字母abc.isalpha()True.isdigit()判断是否全是数字123.isdigit()True.isalnum()判断是否全是字母或数字a1.isalnum()True.split(sep)按分隔符分割字符串a,b,c.split(,)[a,b,c].strip()去除首尾空白字符 hello .strip()hello.replace(old, new)替换子串hello.replace(l,x)hexxo.startswith(prefix)判断是否以某前缀开头hello.startswith(he)True.endswith(suffix)判断是否以某后缀结尾hello.endswith(lo)True字典方法方法作用示例返回值.get(key, default)获取键的值不存在返回默认值d.get(a, 0)值或0.setdefault(key, default)键存在返回值不存在则设置默认值并返回d.setdefault(5, [])列表.items()返回所有键值对视图d.items()dict_items([(a,1)]).keys()返回所有键的视图d.keys()dict_keys([a,b]).values()返回所有值的视图d.values()dict_values([1,2]).pop(key, default)删除并返回键的值d.pop(a, 0)值或0.update(other)用另一个字典更新d.update({c:3})None.clear()清空字典d.clear()None列表方法方法作用示例返回值.append(x)在列表末尾添加一个元素lst.append(5)None.extend(iterable)将可迭代对象的所有元素添加到列表lst.extend([1,2])None.insert(i, x)在指定位置插入元素lst.insert(0, 5)None.remove(x)删除第一个值为x的元素lst.remove(5)None.pop(i)删除并返回指定位置元素lst.pop(0)被删除的元素.index(x)返回第一个值为x的索引lst.index(5)索引值.count(x)统计x出现的次数lst.count(5)次数.sort()原地排序lst.sort()None.reverse()原地反转lst.reverse()None.clear()清空列表lst.clear()None