Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >用好collections模块,对李白诗集进行字频统计

用好collections模块,对李白诗集进行字频统计

作者头像
朱卫军 AI Python
发布于 2022-04-03 01:20:10
发布于 2022-04-03 01:20:10
39600
代码可运行
举报
运行总次数:0
代码可运行

1、从一个计数问题开始

初学Python的人很可能会遇到字频统计这样的练习题,那么很容易会想到使用for循环来做。

可是for循环的效率是很低的,而且会涉及到嵌套循环,代码及其冗余。

比如给定一个字符串,对字母进行计数统计:

Python is a popular programming language

一般会这样写:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
my_str = "Python is a popular programming language"

def str_count(strs):
    '''对字符串进行字频统计,使用字典的get方法进行判断'''
    str_dict = {}
    for i in strs:
        str_dict[i] = str_dict.get(i,0) + 1
    return str_dict

str_count(my_str)

输出:

这次我们来介绍collection模块中的一个计数方法Counter,用它来计数操作可能只需一行代码。

也由此学习一下Python中的内置模块-collections及它的强大功能。

如果使用Counter计数器来对上面那段字符串进行字频统计,就很简单:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from collections import Counter
my_str = "Python is a popular programming language"
Counter(my_str)

输出:

可以看到Counter计数器使用非常简单,只需要传入可迭代对象,就能统计每个元素的出现频次。

如果要对一篇文章,甚至一部小说进行字频统计,该怎么做呢?

以李白诗集为例,任务是统计所有字的频次,并找出出现频次最高的十个字。

这里你不妨先猜猜会有哪些字名列前十,话不多说放代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from collections import Counter

with open('李白.txt') as f:
    # 读取成列表
    c_list = f.readlines()
    
    # 所有诗整合成字符串
    c_str = ','.join(c_list)
    
    # 使用Counter进行字频统计
    c_cnt = Counter(c_str)
    
    # 去除符号、'李''白'等特殊字符
    useless_character = [',',',','。','【','】','\n','李','白']
    for i in useless_character:
        del c_cnt[i]
        
    # 使用most_common方法提取频次最高的前10字符
    c_top_10 = c_cnt.most_common(10)
    
    # 打印
    print(c_cnt)
    print(c_top_10)

输出:

出现频次最高的前十个字:

你猜中了几个呢?

2、聊聊Counter具体用法

collections是一个容器模块,来提供Python标准内建容器 dict、list、set、tuple 的替代选择。

也就是说collections模块是作为Python内建容器的补充,在很多方面它用起来更加有效率。

Counter是字典的子类,用于计数可哈希对象。

计数元素像字典键(key)一样存储,它们的计数存储为值。

所以说Counter对象可以使用字典的所有方法。

创建Counter对象

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from collections import Counter
 # 创建了一个空的Counter对象
c = Counter()
# 用可迭代对象创建了一个Counter对象
c = Counter('gallahad')
 # 用映射来创建一个Counter
c = Counter({'red': 4, 'blue': 2})
#用关键字参数创建Counter
c = Counter(cats=4, dogs=8)

对可迭代对象进行计数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from collections import Counter
c = Counter('bananas')
c
# 输出:Counter({'b': 1, 'a': 3, 'n': 2, 's': 1})

根据键引用值

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from collections import Counter
c = Counter('bananas')
c['a']
# 输出:3

如果不存在该键,则返回0

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from collections import Counter
c = Counter('bananas')
c['u']
# 输出:0

删除其中一个键值对

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from collections import Counter
c = Counter('bananas')
del c['a']
c
# 输出:Counter({'b': 1, 'n': 2, 's': 1})

用映射来创建一个Counter,并返回迭代器

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from collections import Counter
c = Counter({'red': 3, 'blue': 1,'black':2})
list(c.elements())
# 输出:['red', 'red', 'red', 'blue', 'black', 'black']

查看出现频次最高的前n元素及其次数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from collections import Counter
c = Counter('absabasdvdsavssaffsdaws')
c.most_common(3)
# 输出:[('s', 7), ('a', 6), ('d', 3)]

两个Counter相减

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from collections import Counter
c = Counter(a=4, b=2, c=0)
d = Counter(a=1, b=2, c=3)
c.subtract(d)
c
# 输入:Counter({'a': 3, 'b': 0, 'c': -3})

转换成字典

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from collections import Counter
c = Counter('bananas')
dict(c)
# 输出:{'b': 1, 'a': 3, 'n': 2, 's': 1}

添加可迭代对象

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from collections import Counter
c = Counter('bananas')
c.update('apples')
c
# 输出:Counter({'b': 1, 'a': 4, 'n': 2, 's': 2, 'p': 2, 'l': 1, 'e': 1})

3、总结

Counter是字典的一个子类,它继承了字典的所有方法。

Counter作为计数器,使用简单高效。

键代表计数元素,值代表计数值。

most_common()方法用于排序,选取频次前n的键值对。

Counter对象可以进行加减运算及逻辑运算操作。

注:后台回复:李白,可获取示例txt文档

-END-

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-02-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python大数据分析 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Python基础-5 常用的数据结构(集合、字典)
参考手册:“set 对象是由具有唯一性的 hashable 对象所组成的无序多项集。”
一只大鸽子
2022/12/06
7370
Python常用数据结构之collections模块建议收藏
  Counter作为字典dicit()的一个子类用来进行hashtable计数,将元素进行数量统计,计数后返回一个字典,键值为元素,值为元素个数
全栈程序员站长
2022/07/14
3520
python 标准类库-数据类型之集合-容器数据类型
>>> for word in ['red', 'blue', 'red', 'green', 'blue', 'blue']:
授客
2019/09/11
4020
python 标准类库-数据类型之集合-容器数据类型
蓝桥杯python库math、collections
popitem()函数:3.7以下版本的字典随机删除一个key-value对然后返回;3.7及以上版本删除最后一个元素返回
@小森
2024/03/15
1050
蓝桥杯python库math、collections
Python 中的容器 collections
我们都知道 Python 中内置了许多标准的数据结构,比如列表,元组,字典等。与此同时标准库还提供了一些额外的数据结构,我们可以基于它们创建所需的新数据结构。
编程文青李狗蛋
2019/11/07
8060
四种高性能数据类型,Python collections助你优化代码、简洁任务
Python 的最大优势之一就是它有各种各样的模块和软件包可供选择。这些模块和包将 Python 的功能扩展到了许多流行领域,包括机器学习、数据科学、Web 开发和前端等。其中表现最好的一个就是 Python 内置的 collections 模块了。
机器之心
2019/11/04
3010
Python collections函数
一个Counter是dict子类,用于计数可哈希的对象。这是一个无序的容器,元素被作为字典的key存储,它们的计数作为字典的value存储。Counts允许是任何证书,包括0和负数。Counter和其它语言中的bags或者multisets类似。Counter中的元素来源如下:
周小董
2019/03/25
5750
Python3 Counter容器详解与使用指南
Counter 是 Python 标准库 collections 模块中提供的一个高效计数工具,自 Python 2.7 版本引入并持续优化至今。
程序熵
2025/03/26
1080
Python中好用又高效的Collections 模块
本文将简单介绍一个Python模块Collections。这个模块实现了一些很好用的数据结构,可以帮助我们解决不同的实际问题。
宇宙之一粟
2020/10/26
6070
Python中好用又高效的Collections 模块
Python 实用小技巧(2)
上节提到匿名函数lambda作为内置函数的参数,其中有sorted函数 此时lambda函数用于指定对列表中所有元素进行排序的准则。
数据STUDIO
2021/06/24
4760
Python collection的使用
Python中的基本数据结构有list,dict,tuple,set。Python还有一个功能比较强大的包collections,可以处理并维护一个有序的dict,可以提高程序的运行效率。 1、collections中defaultdict的使用 defaultdict在字典dict的基础之上添加一个参数default_factory(default_factory可以指定为list,set,int) 例子1:将下面的list转换成一个dict,其中key对应的value是一个list
py3study
2020/01/09
4630
Python | 原来 collections 这么好用!!
https://blog.csdn.net/mall_lucy/article/details/108822795
咸鱼学Python
2020/11/20
8950
Python | 原来 collections 这么好用!!
刚才,我发现了Python强大的内置模块collections
collections 是 Python 的一个内置模块,所谓内置模块的意思是指 Python 内部封装好的模块,无需安装即可直接使用。
Wu_Candy
2022/07/05
3020
【编程课堂】计数器 Counter
上一期的编程课堂我们介绍了 有序字典 OrderedDict,这一期我们再来聊聊 同属 collections 模块的另一种数据类型 Counter。 在了解 Counter 之前,请大家思考一个问题,现在有包含多个词汇的列表: list1 = ['red','green','red','blue','green','red'] 该如何去统计列表中各词汇出现的次数? 如果再深入一些,如何统计一本小说中,作者所用词汇出现的次数? Python 里提供了一个优雅简洁的解决方案:Counter 关于 Counte
Crossin先生
2018/04/17
1.1K0
Python中collections模块学习
这个模块实现了特定目标的容器,以提供Python标准内建容器 dict、list、set、tuple 的替代选择。
北山啦
2022/11/27
4320
Python中collections模块学习
[编程经验] Python之collections模块
collections模块是一个不用不知道,一用就上瘾的模块。因为它提供了几种非常方便的数据结构和方法,在有些情况下特别好用。今天给大家总结一下其中的OrderDict和Counter两个方法,在平时我经常用的方法,希望你也能喜欢它。然后还有比如deque,namedtuple,defaultdict等也是很有的方法,了解了以后重点是熟练的使用,灵活的应用到你的具体任务中,是需要掌握的。 1. OrderDict # Example 1 dict_1 = dict() dict_1['A'] = "I lo
用户1622570
2018/04/11
6770
Python标准库笔记(4) — collections模块
目录[-] 这个模块提供几个非常有用的Python容器类型 1.容器 名称 功能描述 OrderedDict 保持了key插入顺序的dict namedtuple 生成可以使用名字来访问元素内容的tuple子类 Counter 计数器,主要用来计数 deque 类似于list的容器,可以快速的在队列头部和尾部添加、删除元素 defaultdict dict的子类,带有默认值的字典 2.OrderedDict OrderedDict类似于正常的词典,只是它记住了元
jhao104
2018/03/20
9070
python:collections模块中的数据结构
python中的数据结构除了内置的数据结构如列表、字典、元组、集合等之外,python的colletions内置模块中还有一些高级的数据结构,可以在特定场景下提高便利性,缩减代码量。colletions中的常用数据结果有:
生信菜鸟团
2022/01/05
5350
[Python技巧]是时候用 defaultdict 和 Counter 代替 dictionary 了
我们在采用 dict 的时候,一般都需要判断键是否存在,如果不存在,设置一个默认值,存在则采取其他的操作,但这个做法其实需要多写几行代码,那么是否有更高效的写法,可以减少代码,但可读性又不会降低呢,毕竟作为程序员,我们都希望写出可用并且高效简洁的代码。
kbsc13
2019/08/16
1.7K0
数据类型(一)、collections模块
除python提供的内置数据类型(int、float、str、list、tuple、dict)外,collections模块还提供了其他数据类型,使用如下功能需先导入collections模块(import collections):
狼啸风云
2023/10/07
2970
数据类型(一)、collections模块
相关推荐
Python基础-5 常用的数据结构(集合、字典)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档