问题:
统计一个文件中每一个单词涌现的次数,列出涌现频次最多的5个单词。
媒介:
这道题在现实应用场景中应用比较普遍,比方统计历年来四六级测验中涌现的高频辞汇,记得李笑来就应用他的编程妙技出书过一本背单词的畅销书,就是依据词频来记单词,深受门生喜好。这就是一个把编程妙技用来处置惩罚现实问题的典范场景。别的,在数据剖析时,那些词云效果本质上都是基于词频统计来调解字体的大小,如果你能闇练应用Python中的学问来处置惩罚问题的话,申明你真的入门Python了。
剖析
本题重要考核以下几个方面的学问点:
1、如何准确读写文件
在python中读写文件能够应用内置函数open(),而 open 函数在python2 和 python3 中有肯定的辨别,比方 Python 中能够指定读写文件的编码花样,而 Python 则不能够,为了同时兼容2和3,我们通常会应用io模块下面的 open 函数,人人能够查文档搞清晰它们之间的辨别,造就主动进修才和查资料的习气。
别的一点是读写文件完成以后是须要封闭文件描述符的,除了能够应用 try...except...finally的语法以后,我们还能够应用更文雅的 with … as 的语法来自动封闭文件。
2、如何对数据举行排序
sorted函数是一个应用频次很高的内置函数,它的用法也很壮大,由于它能够经由过程指定参数 key 来举行自定义排序,也就意味着你不仅能够对数字排序、对字母排序、还能够对列表、字典、自定义的对象举行排序,你只须要要通知 sorted 函数的排序划定规矩是什么,比方一个people对象,我既能够依据岁数排序也能够依据身高体重来排序,所以这个函数时异常天真的,别的,关于列表对象有自带的 sort 要领,如果能辨别清晰 list.sort 与 sorted 之间辨别那申明你已能天真应用了。
3、字典数据类型的应用
做词频统计,用字典无疑是最合适的数据类型,单词作为字典的key, 单词涌现的次数作为字典的 value,很方便地就纪录好了每一个单词的频次,字典很像我们的电话本,每一个名字关联一个电话号码。别的,字典最大的特性就是它的查询速率会异常快。抱负状况下时刻庞杂度为O(1),我是说抱负状况,如果你想深切相识字典的话,发起看看这篇文章 https://www.laurentluce.com/posts/python-dictionary-implementation/
4、正则表达式的应用
对文本、字符串处置惩罚,正则表达式简直是神器,无论是做数据爬虫照样数据洗濯应用异常普遍,固然,正则表达式并非Python特有的东西,一切编程言语都支撑,我们要做的除了进修正则表达式另有他的API,只要熟习了API我们才应用到现实场景中去。关于正则表达式引荐一篇文章:http://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html ,别的我还发现有同砚引入了jieba分词库,这个库在做中文分词异常有效,感兴趣的能够去相识一下。
完成
剖析完以后,我们完成起来现实上是异常快的。所以我们在拿到一个需求的时刻,起首肯定是把需求弄清晰,想一想也许能够用哪些手艺来完成,随后才是动手写代码,实在我们在事情上,真正写代码的时刻还不到一半。
# -*- 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)
打印效果:
('is', 10)
('better', 8)
('than', 8)
('the', 6)
('to', 5)
总结
我在看人人代码的时刻,许多代码依旧存在有定名不范例(发起读PEP8),代码的排版杂沓(浏览起来很难题,发起用Pycharm举行花样化)。另有不少代码的完成体式格局看起来很庞杂(每每越庞杂的代码Bug越多)。固然,完成要领不是唯一。
比方Python模块自身就供应了一个collections.Counter的类,它继续自dict类,就是用于做统计的,我发现有部份同砚应用的就是这个类来完成的,仔细的你能够发现了,我完成的这个Counter和collections下面谁人Counter很像,实在这就是造轮子,造轮子能够磨炼我们的编程头脑,固然在事情上有现成的东西就没必要本身造轮子了,除非你有自信心做得更好。你也能够思索思索,如果Python没有供应Counter这个东西,你该如何做。
别的,该模块还供应一个有序的字典对象 OrderedDict,应用它能够免除我们手动排序的操纵。末了发起人人进修总结上面我提到的一切内容。如果你能对峙100天,置信你对Python的控制水平是游刃有余的。
置信看了本文案例你已控制了要领,更多出色请关注ki4网别的相干文章!
引荐浏览:
Python中如何把矩阵转换为列表
在python中列表,数组,矩阵相互转换的要领
以上就是Python如何统计字母涌现的次数的细致内容,更多请关注ki4网别的相干文章!