Python統(tǒng)計(jì)單詞出現(xiàn)的次數(shù)
題目:
統(tǒng)計(jì)一個(gè)文件中每個(gè)單詞出現(xiàn)的次數(shù),列出出現(xiàn)頻率最多的5個(gè)單詞。
前言:
這道題在實(shí)際應(yīng)用場(chǎng)景中使用比較廣泛,比如統(tǒng)計(jì)歷年來(lái)四六級(jí)考試中出現(xiàn)的高頻詞匯,記得李笑來(lái)就利用他的編程技能出版過(guò)一本背單詞的暢銷(xiāo)書(shū),就是根據(jù)詞頻來(lái)記單詞,深受學(xué)生喜歡。這就是一個(gè)把編程技能用來(lái)解決實(shí)際問(wèn)題的典型場(chǎng)景。另外,在數(shù)據(jù)分析時(shí),那些詞云效果本質(zhì)上都是基于詞頻統(tǒng)計(jì)來(lái)調(diào)整字體的大小,如果你能熟練運(yùn)用Python中的知識(shí)來(lái)解決問(wèn)題的話(huà),說(shuō)明你真的入門(mén)Python了。
分析
本題主要考察以下幾個(gè)方面的知識(shí)點(diǎn):
1、如何正確讀寫(xiě)文件
在python中讀寫(xiě)文件可以使用內(nèi)置函數(shù)open(),而 open 函數(shù)在python2 和 python3 中有一定的區(qū)別,比如 Python 中可以指定讀寫(xiě)文件的編碼格式,而 Python 則不可以,為了同時(shí)兼容2和3,我們通常會(huì)使用io模塊下面的 open 函數(shù),大家可以查文檔搞清楚它們之間的區(qū)別,培養(yǎng)主動(dòng)學(xué)習(xí)能力和查資料的習(xí)慣。
另外一點(diǎn)是讀寫(xiě)文件完成之后是需要關(guān)閉文件描述符的,除了可以使用 try...except...finally的語(yǔ)法之后,我們還可以使用更優(yōu)雅的 with … as 的語(yǔ)法來(lái)自動(dòng)關(guān)閉文件。
2、如何對(duì)數(shù)據(jù)進(jìn)行排序
sorted函數(shù)是一個(gè)使用頻率很高的內(nèi)置函數(shù),它的用法也很強(qiáng)大,因?yàn)樗梢酝ㄟ^(guò)指定參數(shù) key 來(lái)進(jìn)行自定義排序,也就意味著你不僅可以對(duì)數(shù)字排序、對(duì)字母排序、還可以對(duì)列表、字典、自定義的對(duì)象進(jìn)行排序,你只需要要告訴 sorted 函數(shù)的排序規(guī)則是什么,比如一個(gè)people對(duì)象,我既可以根據(jù)年齡排序也可以根據(jù)身高體重來(lái)排序,所以這個(gè)函數(shù)時(shí)非常靈活的,另外,對(duì)于列表對(duì)象有自帶的 sort 方法,如果能區(qū)分清楚 list.sort 與 sorted 之間區(qū)別那說(shuō)明你已經(jīng)能靈活運(yùn)用了。
3、字典數(shù)據(jù)類(lèi)型的運(yùn)用
做詞頻統(tǒng)計(jì),用字典無(wú)疑是最合適的數(shù)據(jù)類(lèi)型,單詞作為字典的key, 單詞出現(xiàn)的次數(shù)作為字典的 value,很方便地就記錄好了每個(gè)單詞的頻率,字典很像我們的電話(huà)本,每個(gè)名字關(guān)聯(lián)一個(gè)電話(huà)號(hào)碼。另外,字典最大的特點(diǎn)就是它的查詢(xún)速度會(huì)非常快。理想情況下時(shí)間復(fù)雜度為O(1),我是說(shuō)理想情況,如果你想深入了解字典的話(huà),建議看看這篇文章 https://www.laurentluce.com/posts/python-dictionary-implementation/
4、正則表達(dá)式的運(yùn)用
對(duì)文本、字符串處理,正則表達(dá)式簡(jiǎn)直是神器,無(wú)論是做數(shù)據(jù)爬蟲(chóng)還是數(shù)據(jù)清洗使用非常廣泛,當(dāng)然,正則表達(dá)式并不是Python特有的東西,所有編程語(yǔ)言都支持,我們要做的除了學(xué)習(xí)正則表達(dá)式還有他的API,只有熟悉了API我們才能運(yùn)用到實(shí)際場(chǎng)景中去。關(guān)于正則表達(dá)式推薦一篇文章:http://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html ,另外我還發(fā)現(xiàn)有同學(xué)引入了jieba分詞庫(kù),這個(gè)庫(kù)在做中文分詞非常有用,感興趣的可以去了解一下。
實(shí)現(xiàn)
分析完之后,我們實(shí)現(xiàn)起來(lái)其實(shí)是非??斓?。所以我們?cè)谀玫揭粋€(gè)需求的時(shí)候,首先肯定是把需求弄清楚,想想大概可以用哪些技術(shù)來(lái)實(shí)現(xiàn),隨后才是動(dòng)手寫(xiě)代碼,其實(shí)我們?cè)诠ぷ魃?,真正?xiě)代碼的時(shí)間還不到一半。
# -*- coding:utf-8 -*-
import io
import re
class Counter:
def __init__(self, path):
"""
:param path: 文件路徑
"""
self.mapping = dict()
with io.open(path, encoding="utf-8") as f:
data = f.read()
words = [s.lower() for s in re.findall("\w+", data)]
for word in words:
self.mapping[word] = self.mapping.get(word, 0) + 1
def most_common(self, n):
assert n > 0, "n should be large than 0"
return sorted(self.mapping.items(), key=lambda item: item[1], reverse=True)[:n]
if __name__ == '__main__':
most_common_5 = Counter("importthis.txt").most_common(5)
for item in most_common_5:
print(item)
打印結(jié)果:
('is', 10)
('better', 8)
('than', 8)
('the', 6)
('to', 5)
總結(jié)
我在看大家代碼的時(shí)候,很多代碼依然存在有命名不規(guī)范(建議讀PEP8),代碼的排版混亂(閱讀起來(lái)很困難,建議用Pycharm進(jìn)行格式化)。還有不少代碼的實(shí)現(xiàn)方式看起來(lái)很復(fù)雜(往往越復(fù)雜的代碼Bug越多)。當(dāng)然,實(shí)現(xiàn)方法不是唯一。
比如Python模塊本身就提供了一個(gè)collections.Counter的類(lèi),它繼承自dict類(lèi),就是用于做統(tǒng)計(jì)的,我發(fā)現(xiàn)有部分同學(xué)使用的就是這個(gè)類(lèi)來(lái)實(shí)現(xiàn)的,細(xì)心的你可能發(fā)現(xiàn)了,我實(shí)現(xiàn)的這個(gè)Counter和collections下面那個(gè)Counter很像,其實(shí)這就是造輪子,造輪子可以鍛煉我們的編程思維,當(dāng)然在工作上有現(xiàn)成的東西就沒(méi)必要自己造輪子了,除非你有信心做得更好。你也可以思考思考,假如Python沒(méi)有提供Counter這個(gè)工具,你該怎么做。
另外,該模塊還提供一個(gè)有序的字典對(duì)象 OrderedDict,使用它可以免去我們手動(dòng)排序的操作。最后建議大家學(xué)習(xí)總結(jié)上面我提到的所有內(nèi)容。如果你能堅(jiān)持100天,相信你對(duì)Python的掌握程度是游刃有余的。
以上所述是小編給大家介紹的Python統(tǒng)計(jì)單詞出現(xiàn)的次數(shù),希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
python 使用pdfminer3k 讀取PDF文檔的例子
今天小編就為大家分享一篇python 使用pdfminer3k 讀取PDF文檔的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-08-08
Python調(diào)用騰訊API實(shí)現(xiàn)人臉身份證比對(duì)功能
這篇文章主要介紹了Python調(diào)用騰訊API進(jìn)行人臉身份證比對(duì),簡(jiǎn)單介紹了調(diào)用騰訊云API步驟,通過(guò)完整代碼展示與結(jié)果,需要的朋友可以參考下2022-04-04
python中的循環(huán)結(jié)構(gòu)問(wèn)題
這篇文章主要介紹了python中的循環(huán)結(jié)構(gòu)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03
No module named 'plotly.graph_objects&ap
這篇文章主要為大家介紹了No module named 'plotly.graph_objects'報(bào)錯(cuò)解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12
Keras使用tensorboard顯示訓(xùn)練過(guò)程的實(shí)例
今天小編就為大家分享一篇Keras使用tensorboard顯示訓(xùn)練過(guò)程的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-02-02
關(guān)于PyQt5中QtGui.QImage圖片顯示問(wèn)題解析
PyQt作為Qt語(yǔ)言的Python擴(kuò)展,可以用來(lái)方便快速的開(kāi)發(fā)界面應(yīng)用,本文重點(diǎn)給大家介紹PyQt5中的QtGui.QImage圖片顯示問(wèn)題分析,需要的朋友可以參考下2022-03-03
YOLOv5改進(jìn)之添加SE注意力機(jī)制的詳細(xì)過(guò)程
作為當(dāng)前先進(jìn)的深度學(xué)習(xí)目標(biāo)檢測(cè)算法YOLOv5,已經(jīng)集合了大量的trick,但是還是有提高和改進(jìn)的空間,針對(duì)具體應(yīng)用場(chǎng)景下的檢測(cè)難點(diǎn),可以不同的改進(jìn)方法,下面這篇文章主要給大家介紹了關(guān)于YOLOv5改進(jìn)之添加SE注意力機(jī)制的相關(guān)資料,需要的朋友可以參考下2022-08-08
Python中列表遍歷使用range和enumerate的區(qū)別講解
這篇文章主要介紹了Python中列表遍歷使用range和enumerate的區(qū)別,在Python編程語(yǔ)言中,遍歷list有range和enumerate方法,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-12-12

