Python 統(tǒng)計(jì)字?jǐn)?shù)的思路詳解
問(wèn)題描述:
用 Python 實(shí)現(xiàn)函數(shù) count_words(),該函數(shù)輸入字符串 s 和數(shù)字 n,返回 s 中 n 個(gè)出現(xiàn)頻率最高的單詞。返回值是一個(gè)元組列表,包含出現(xiàn)次數(shù)最高的 n 個(gè)單詞及其次數(shù),即 [(<單詞1>, <次數(shù)1>), (<單詞2>, <次數(shù)2>), ... ],按出現(xiàn)次數(shù)降序排列。
您可以假設(shè)所有輸入都是小寫(xiě)形式,并且不含標(biāo)點(diǎn)符號(hào)或其他字符(只包含字母和單個(gè)空格)。如果出現(xiàn)次數(shù)相同,則按字母順序排列。
例如:
print count_words("betty bought a bit of butter but the butter was bitter",3)
輸出:
[('butter', 2), ('a', 1), ('betty', 1)]
解決問(wèn)題的思路:
1. 將字符串s進(jìn)行空白符分割得到所有的單詞列表split_s,如:['betty', 'bought', 'a', 'bit', 'of', 'butter', 'but', 'the', 'butter', 'was', 'bitter']
2. 建立maplist,將split_s轉(zhuǎn)化為元素為元組的列表形式,如:[('betty', 1), ('bought', 1), ('a', 1), ('bit', 1), ('of', 1), ('butter', 1), ('but', 1), ('the', 1), ('butter', 1), ('was', 1), ('bitter', 1)]
3. 合并maplist中元素,元組的第一個(gè)索引值相同,則將其第二個(gè)索引值相加。
// 備注:準(zhǔn)備采用defaultdict。得到的數(shù)據(jù)如下:{'betty': 1, 'bought': 1, 'a': 1, 'bit': 1, 'of': 1, 'butter': 2, 'but': 1, 'the': 1, 'was': 1, 'bitter': 1}
4. 進(jìn)行排序,按照key進(jìn)行字母排序,得到如下:[('a', 1), ('betty', 1), ('bit', 1), ('bitter', 1), ('bought', 1), ('but', 1), ('butter', 2), ('of', 1), ('the', 1), ('was', 1)]
5. 進(jìn)行二次排序, 按照value進(jìn)行排序,得到如下:[('butter', 2), ('a', 1), ('betty', 1), ('bit', 1), ('bitter', 1), ('bought', 1), ('but', 1), ('of', 1), ('the', 1), ('was', 1)]
6. 使用切片取出頻率較高的*組數(shù)據(jù)
總結(jié):在python3上不進(jìn)行defaultdict進(jìn)行排序結(jié)果也是正確的,python2上不正確。defaultdict本身是沒(méi)有順序的,要區(qū)分列表,所以必須進(jìn)行排序。
也可嘗試自己寫(xiě),不借助第三方模塊
解決方案1(使用defaultdict):
from collections import defaultdict """Count words.""" def count_words(s, n): """Return the n most frequently occuring words in s.""" split_s = s.split() map_list = [(k,1) for k in split_s] output = defaultdict(int) for d in map_list: output[d[0]] += d[1] output1 = dict(output) top_n = sorted(output1.items(), key=lambda pair:pair[0], reverse=False) top_n = sorted(top_n, key=lambda pair:pair[1], reverse=True) return top_n[:n] def test_run(): """Test count_words() with some inputs.""" print(count_words("cat bat mat cat bat cat", 3)) print(count_words("betty bought a bit of butter but the butter was bitter", 4)) if __name__ == '__main__': test_run()
解決方案2(使用Counter)
from collections import Counter """Count words.""" def count_words(s, n): """Return the n most frequently occuring words in s.""" split_s = s.split() split_s = Counter(name for name in split_s) print(split_s) top_n = sorted(split_s.items(), key=lambda pair:pair[0], reverse=False) print(top_n) top_n = sorted(top_n, key=lambda pair:pair[1], reverse=True) print(top_n) return top_n[:n] def test_run(): """Test count_words() with some inputs.""" print(count_words("cat bat mat cat bat cat", 3)) print(count_words("betty bought a bit of butter but the butter was bitter", 4)) if __name__ == '__main__': test_run()
總結(jié)
以上所述是小編給大家介紹的Python 統(tǒng)計(jì)字?jǐn)?shù)的思路詳解,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
python調(diào)用OpenCV實(shí)現(xiàn)人臉識(shí)別功能
這篇文章主要為大家詳細(xì)介紹了python調(diào)用OpenCV實(shí)現(xiàn)人臉識(shí)別功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05Python操作mongodb數(shù)據(jù)庫(kù)的方法詳解
這篇文章主要介紹了Python操作mongodb數(shù)據(jù)庫(kù)的方法,結(jié)合實(shí)例形式詳細(xì)分析了Python下載、安裝pymongo及操作MongoDB數(shù)據(jù)庫(kù)相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2018-12-12Python如何實(shí)現(xiàn)自帶HTTP文件傳輸服務(wù)
這篇文章主要介紹了Python如何實(shí)現(xiàn)自帶HTTP文件傳輸服務(wù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07django 中的聚合函數(shù),分組函數(shù),F(xiàn) 查詢(xún),Q查詢(xún)
這篇文章主要介紹了django 中的聚合函數(shù),分組函數(shù),F(xiàn) 查詢(xún),Q查詢(xún),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07基于python的前后端分離的模擬實(shí)現(xiàn)
前后端分離核心是UI界面展示層(View)和數(shù)據(jù)處理層(Model)通過(guò)控制層(Controller)進(jìn)行解耦合,在MVC設(shè)計(jì)模式中,前端主要負(fù)責(zé)數(shù)據(jù)展示和用戶(hù)交互(View),后端處理業(yè)務(wù)邏輯和數(shù)據(jù)存儲(chǔ)(Model),通過(guò)API接口進(jìn)行通信,提高了開(kāi)發(fā)效率,便于前后端分工合作,有利于代碼的維護(hù)和迭代2024-10-10python自帶tkinter庫(kù)實(shí)現(xiàn)棋盤(pán)覆蓋圖形界面
這篇文章主要為大家詳細(xì)介紹了python自帶tkinter庫(kù)實(shí)現(xiàn)棋盤(pán)覆蓋圖形界面,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-07-07python 讀取txt,json和hdf5文件的實(shí)例
今天小編就為大家分享一篇python 讀取txt,json和hdf5文件的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-06-06Django框架自定義模型管理器與元選項(xiàng)用法分析
這篇文章主要介紹了Django框架自定義模型管理器與元選項(xiàng)用法,結(jié)合實(shí)例形式分析了自定義模型管理器與元選項(xiàng)的功能、用法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2019-07-07