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

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

1、从一个计数问题开始

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

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

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

Python is a popular programming language

一般会这样写:

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计数器来对上面那段字符串进行字频统计,就很简单:

from collections import Counter
my_str = "Python is a popular programming language"
Counter(my_str)

输出:

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

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

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

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

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对象

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)

对可迭代对象进行计数

from collections import Counter
c = Counter('bananas')
c
# 输出:Counter({'b': 1, 'a': 3, 'n': 2, 's': 1})

根据键引用值

from collections import Counter
c = Counter('bananas')
c['a']
# 输出:3

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

from collections import Counter
c = Counter('bananas')
c['u']
# 输出:0

删除其中一个键值对

from collections import Counter
c = Counter('bananas')
del c['a']
c
# 输出:Counter({'b': 1, 'n': 2, 's': 1})

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

from collections import Counter
c = Counter({'red': 3, 'blue': 1,'black':2})
list(c.elements())
# 输出:['red', 'red', 'red', 'blue', 'black', 'black']

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

from collections import Counter
c = Counter('absabasdvdsavssaffsdaws')
c.most_common(3)
# 输出:[('s', 7), ('a', 6), ('d', 3)]

两个Counter相减

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})

转换成字典

from collections import Counter
c = Counter('bananas')
dict(c)
# 输出:{'b': 1, 'a': 3, 'n': 2, 's': 1}

添加可迭代对象

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对象可以进行加减运算及逻辑运算操作。

相关文章
|
SQL Java
解读JAVA处理排名问题-关于学生成绩排名及Collections中的sort方法与Comparable的使用
写一个项目真是存在很多的bug,修复的时间往往比开发所需要的时间更长,今天又出了一个bug,在这里记录一下,主要是针对系统中学生的成绩排名。
152 0
|
6月前
|
Java
JavaSE——集合框架二(2/6)-综合案例-斗地主游戏(做牌、洗牌、发牌、排序、看牌)
JavaSE——集合框架二(2/6)-综合案例-斗地主游戏(做牌、洗牌、发牌、排序、看牌)
28 0
|
7月前
|
Scala 容器
Scala学习--day04--集合、常用方法、案例实操 - WordCount TopN、不同省份的商品点击排行
Scala学习--day04--集合、常用方法、案例实操 - WordCount TopN、不同省份的商品点击排行
111 2
|
7月前
|
开发框架 .NET C#
C#学习相关系列之Linq常用方法---排序(一)
C#学习相关系列之Linq常用方法---排序(一)
|
Python 容器
Python技术文章:深入理解collections模块
collections模块是Python的内建模块之一,它实现了特殊的容器数据类型,提供了Python内建的数据类型dict、list、set、和tuple的高效替代选择。 ## 一、namedtuple `namedtuple()` 函数是一个工厂函数,它返回一个子类,这个子类继承自 tuple 类,并且拥有名字,这个名字就是你传给 `namedtuple()` 的第一个参数。这个子类的实例就像一个普通的元组,但是还提供了方便的属性访问。`namedtuple`是一种定义小型和不可变的数据类的简单方法。
|
存储 Java 容器
Map,List的用法与区别,很基础,蛋或许你不通透
Map,List的用法与区别,很基础,蛋或许你不通透
145 0
Map,List的用法与区别,很基础,蛋或许你不通透
|
Python
python实现简易的学生成绩管理
python实现简易的学生成绩管理
138 0
|
Java Android开发
用java语言生成成绩柱状图
用java语言生成成绩柱状图
262 0
用java语言生成成绩柱状图
PTA 1038 统计同成绩学生 (20 分)
本题要求读入 N 名学生的成绩,将获得某一给定分数的学生人数输出。
86 0
|
存储 Java
Java初学者作业——编写Java程序,根据输入的某个班级的学员成绩,计算该班级学员的平均成绩,要求输入班级的人数。
Java初学者作业——编写Java程序,根据输入的某个班级的学员成绩,计算该班级学员的平均成绩,要求输入班级的人数。
636 0
Java初学者作业——编写Java程序,根据输入的某个班级的学员成绩,计算该班级学员的平均成绩,要求输入班级的人数。