用Python实现函数count_words(),该函数输入字符串年代和数字n,返回s中n个出现频率最高的单词。返回值是一个元组列表,包含出现次数最高的n个单词及其次数,即((& lt;单词1祝辞,& lt;次数1祝辞),(& lt;单词2祝辞,& lt;次数2祝辞),…),按出现次数降序排列。
您可以假设所有输入都是小写形式,并且不含标点符号或其他字符(只包含字母和单个空格)。如果出现次数相同,则按字母顺序排列。
例如:
打印count_words(“贝蒂买了一点黄油,但是黄油是苦的”,3)
输出:
[(“黄油”,2),(' a ', 1),(“贝蒂”,1)]
引用>
1。将字符串年代进行空白符分割得到所有的单词列表split_s,如:[‘贝蒂’,‘买’,‘“,“一点”,“的”,“黄油”,“但是”,“的”,“黄油”,“是”、“苦”)
2。建立maplist,将split_s转化为元素为元组的列表形式,如:[(“贝蒂”,1),(‘买’,1),(' a ', 1),(‘位’,1),('的',1),(“黄油”,1),('但是',1),('的',1),(“黄油”,1),('是',1),(‘苦’,1)]
3。合并maplist中元素,元组的第一个索引值相同,则将其第二个索引值相加。
//备注:准备采用defaultdict。得到的数据如下:{“贝蒂”:1、“买”:1、“一个”:1、“钻头”:1、“的”:1、“黄油”:2,“但是”:1、“”:1、“是”:1、“苦”:1}
4。进行排序,按照关键进行字母排的序,得到如下:[(' a ', 1),(“贝蒂”,1),(‘位’,1),(‘苦’,1),(‘买’,1),('但是',1),(“黄油”,2),('的',1),('的',1),('是',1)]
5。进行二次排序,按照值进行排序,得到如下:[(“黄油”,2),(' a ', 1),(“贝蒂”,1),(‘位’,1),(‘苦’,1),(‘买’,1),('但是',1),('的',1),('的',1),('是',1)]
6。使用切片取出频率较高的*组数据
总结:在python3上不进行defaultdict进行排序结果也是正确的,python2上不正确.defaultdict本身是没有顺序的,要区分列表,所以必须进行排序。
也可尝试自己写,不借助第三方模块
解决方案1(使用defaultdict):
从进口defaultdict集合 ”““计数的话。”“ def count_words (s、n): ”“”返回n最常发生在s。”“ split_s=s.split () map_list=[k (k, 1) split_s) 输出=defaultdict (int) 在map_list: d 输出(d [0]) +=d [1] output1=dict(输出) top_n=排序(output1.items()键=λ对:[0],反向=False) top_n=排序(top_n键=λ对:[1],反向=True) 返回top_n (n): def test_run (): ”““测试count_words()和一些输入。”“ 打印(count_words(“猫蝙蝠垫猫蝙蝠猫”,3)) 打印(count_words(“贝蒂买了一点黄油,但是黄油是苦的”,4)) if __name__==癬_main__”: test_run ()解决方案2(使用计数器)
从进口计数器集合 ”““计数的话。”“ def count_words (s、n): ”“”返回n最常发生在s。”“ split_s=s.split () split_s=计数器(split_s名称的名称) 打印(split_s) top_n=排序(split_s.items()键=λ对:[0],反向=False) 打印(top_n) top_n=排序(top_n键=λ对:[1],反向=True) 打印(top_n) 返回top_n (n): def test_run (): ”““测试count_words()和一些输入。”“ 打印(count_words(“猫蝙蝠垫猫蝙蝠猫”,3)) 打印(count_words(“贝蒂买了一点黄油,但是黄油是苦的”,4)) if __name__==癬_main__”: test_run ()
以上所述是小编给大家介绍的Python统计字数的思路详解,希望对大家有所帮助,如果大家有任何疑问请给我留的言,小编会及时回复大家的。在此也非常感谢大家对网站的支持。
Python统计字数的思路详解