python统计,计数的三种方法 |
您所在的位置:网站首页 › Python数据表格统计 › python统计,计数的三种方法 |
统计
统计用什么数据格式
统计的方法:
1. 字典法
2. 哈希表法
3. collections.counter()方法
总结
1. 我们先来说说统计用什么格式:
我们知道python有列表,字典,元组等等等数据格式,究竟哪种格式比较适合用作统计呢? 现在给出一句诗句: 鹅鹅鹅,曲项向天歌,白毛浮绿水,红掌拨清波。 # 先看看列表如果用列表,统计大概就是这个样子: [['鹅', 3],['曲', 1]...]能看但是不好看。 # 再看看元组,元组的话大概是这样: ('鹅', 3, '曲', 1...)这样就不是我们正常人想看的了,会显得很乱,而且元组只能看不能改。 # 我们再看看字典格式: {'鹅': 3, '曲', 1...}这个格式是可以的,字典是能够明了的看到key 和 value 的对应,所以我们在给一篇文章做统计的时候,我们总是考虑使用字典. 2.统计的方法:在我们知道用字典的时候,我们该怎样操作呢? 这时候,就有很多方法了,我刚学的时候就是纯字典手写,后来知道哈希表之后,觉得哈希表也可以,之后看到collections有个counter方法(数数的方法)然后感觉这三种方法都可以。 (1) 字典 # Author:xueling # 先打开一篇我们要统计的文章,并读取内容 f = open(r'文件地址+文件名', 'r', encoding='utf-8') article = f.read() # 建立一个空字典来存储统计结果 d = {} # 遍历整篇文章 for i in article: d[i] = d.get(i,0) + 1 # 字频统计 # 在此基础上我们还可以做一个排序: ls = sorted(list(d.items()), key= lambda x:x[1], reverse=True) print(d) f.close()我们用了字典的get方法,代码意思是 遍历整篇文章。 每遇到一个新字,就将新字填入到字典d里面,遇到字典已经包含的字就给这个字对应的value + 1 总体方法就是这样,炒鸡简单。打印一下d: {'鹅': 3, '曲': 1, '项': 1, '向': 1, '天': 1, '歌': 1, ',': 2, '白': 1, '毛': 1, '浮': 1, '绿': 1, '水': 1, '红': 1, '掌': 1, '拨': 1, '清': 1, '波': 1, '。': 1}这就是我们想要的结果。 (2)哈希表首先我们要知道什么是哈希表,其实哈希表跟字典很像,存储数据的方式是一样的都是key:value的键值对。 在我们学算法的时候就会学习到哈希表法。 我们想用哈希表,可以通过导collections的包。 # Author:xueling # 在colletions 导入哈希表的包 from collections import defaultdict # 打开一个要统计的文件 f = open(r'文件路径+文件名', 'r', encoding='utf-8') article = f.read() # d是通过defaultdict生成的一个哈希表,其中value我们给int型的数据类型,来记录字符数 d = defaultdict(int) # article里每一个字我们把它当做哈希表里的key,每有一个字就给value + 1,value默认值就是0 for key in article: d[key] += 1 print(d)哈希表在很多时候都是很好用的,而且简单易上手,我们来看一下结果: defaultdict(, {'鹅': 3, '曲': 1, '项': 1, '向': 1, '天': 1, '歌': 1, ',': 2, '白': 1, '毛': 1, '浮': 1, '绿': 1, '水': 1, '红': 1, '掌': 1, '拨': 1, '清': 1, '波': 1, '。': 1})可以说完美。 (3)collections.counter()方法这个其实也是一样的,我们用collections里的counter方法,直接去数数文章里的字頻。 其实我们一直都是在数中文的文章,但是呢,我们要想去统计英语文章的词频该怎么办呢? 所以这个方法我们就来试试英语文章的词频统计。 我们给英语单词做统计,首先,我们要想想,怎么样才可以让计算机识别出单词呢? 英语文章里每写一个单词就要空格,每有一个标点符号,就会把单词分隔。这是文章特性,所以我们利用这一点去把单词从文章里分割出来。 # Author:xueling import re import collections # 打开我们要统计的文件,并读取里面的内容 f = open(r"文件路径+文件名",'r',encoding='utf-8') txt = f.read() # 利用正则表达式匹配非英文的内容,并用split方法给隔开 ls = re.split(r'\W+',txt) print(ls) # 然后用collections.Counter()的方法直接数就行了 col = collections.Counter(ls) print(col) # 然后我们在最后看一下最频繁的10个内容 col_max = col.most_common(10) print(col_max)我在这里使用了正则的方法,去匹配除了字母,数字,下划线的内容(也就是匹配了英语文章里面的标点符号和空格,用作之后的切分),用split给分隔并存入ls里,然后统计ls里的内容就行了。 原文是这样的: Every day is wonderful, if we work hard. 我们拼尽全力,每天都是精彩。 The water of the Yellow River comes from the sky. 黄河之水天上来。结果是这样的: ls: ['Every', 'day', 'is', 'wonderful', 'if', 'we', 'work', 'hard', '我们拼尽全力', '每天都是精彩', 'The', 'water', 'of', 'the', 'Yellow', 'River', 'comes', 'from', 'the', 'sky', '黄河之水天上来', ''] col: Counter({'the': 2, 'Every': 1, 'day': 1, 'is': 1, 'wonderful': 1, 'if': 1, 'we': 1, 'work': 1, 'hard': 1, '我们拼尽全力': 1, '每天 都是精彩': 1, 'The': 1, 'water': 1, 'of': 1, 'Yellow': 1, 'River': 1, 'comes': 1, 'from': 1, 'sky': 1, '黄河之水天上来': 1, '': 1}) col_max: [('the', 2), ('Every', 1), ('day', 1), ('is', 1), ('wonderful', 1), ('if', 1), ('we', 1), ('work', 1), ('hard', 1), ('我们拼尽全力', 1)]col就是我们要的结果。 总结这就是以上的三种统计我个人比较喜欢的方法,前两种方法(字典和哈希表)通过简单的改写也可以用来统计英语文章的单词。 第一种方法是最简单的,是我最经常用的一种方法,很方便快捷,很基础。 第二种方法用了哈希表,哈希表是算法里必会的,也挺不错。 最后一种方法是直接用collections.counter()方法,简单粗暴,但是在数的时候记得转成列表形式。 这是我第一篇文章,如果有哪里写的不好,希望各位看客姥爷一定要指出来,指出必改。欢迎大家来评论,分享其他方法。 我是伤病不可救药。 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |