一、Counter类型简介
Counter类型是Python collections模块提供的一种用来统计元素出现次数的数据结构,它的功能在Python的内置库中是非常强大的。
它的作用是将一个目标序列转换为一个字典,其中元素作为key,其出现的次数作为value,支持上述字典的所有操作。
二、Counter类型常用方法
1. 计数器初始化
可以使用Counter对象进行初始化:
from collections import Counter
c = Counter() #空的计数器
print(c)
# 可以使用一个可迭代对象初始化计数器
c = Counter('abcabcab')
print(c)
输出结果:
Counter()
Counter({'a': 3, 'b': 3, 'c': 3})
说明:上述代码创建了两个对象,第一次创建了一个空的计数器对象,第二次创建了一个包含字符串'abcabcab'中元素及其出现次数的计数器对象。
2. 计数器元素访问
Counter对象通过 key 访问元素的值:
from collections import Counter
c = Counter('abcabcab')
print(c['a'])
print(c['d'])
输出结果:
3
0
说明:上述代码创建了一个包含字符串'abcabcab'中元素及其出现次数的计数器对象,并使用 key 访问了 'a' 及 'd' 元素的值,由于 'd' 在目标序列中没有出现,因此返回0。
3. 计数器元素增加
可以使用update()方法来增加元素个数:
from collections import Counter
c = Counter('abcabcab')
c.update('aaaa') # 把'a'的个数从3增加至7
print(c)
输出结果:
Counter({'a': 7, 'b': 3, 'c': 3})
说明:上述代码创建了一个包含字符串'abcabcab'中元素及其出现次数的计数器对象,并使用 update() 方法将 'a' 的个数从3增加至7。
4. 计数器元素减少
可以使用subtract()方法来减少元素个数:
from collections import Counter
c = Counter('abcabcab')
c.subtract('aabb') # 把'a'的个数从3减少至1
print(c)
输出结果:
Counter({'a': 1, 'c': 3, 'b': 1})
说明:上述代码创建了一个包含字符串'abcabcab'中元素及其出现次数的计数器对象,并使用 subtract() 方法将 'a' 的个数从3减少至1。
5. 计数器元素删除
可以使用del来删除计数器的元素:
from collections import Counter
c = Counter('abcabcab')
del c['a']
print(c)
输出结果:
Counter({'b': 3, 'c': 3})
说明:上述代码创建了一个包含字符串'abcabcab'中元素及其出现次数的计数器对象,并使用 del 删除了 'a' 元素。
6. 计数器的集合操作
Counter对象支持集合交并补等操作,通过加减号来进行集合操作,例如:
from collections import Counter
c1 = Counter('abcabcab')
c2 = Counter('aaaabbbb')
print(c1 + c2) # 集合并
print(c1 - c2) # 集合减
print(c1 & c2) # 集合交
print(c1 | c2) # 集合补
输出结果:
Counter({'a': 7, 'b': 7, 'c': 3})
Counter({'c': 3})
Counter({'a': 3, 'b': 3})
Counter({'a': 4, 'b': 4, 'c': 3})
说明:上述代码创建了两个计数器对象,并进行了集合操作,集合并操作将两个计数器中的元素集合进行相加,相同元素的计数相加,集合减操作将公共部分中的元素数量进行相减,集合交操作取得两个计数器中都存在的元素及其数量,集合补操作得到两个计数器中包含的所有元素及其数量。
三、案例:利用计数器实现词频统计
计数器类型常用于实现词频统计,下面是一个简单的文本处理案例:
from collections import Counter
def word_count(filename, minlen, count):
with open(filename, 'r') as f:
text = f.read()
words = text.split()
words = [word.lower() for word in words if len(word) >= minlen]
c = Counter(words)
return c.most_common(count)
filename = 'test.txt'
minlen = 5
count = 10
print(word_count(filename, minlen, count))
说明:上述代码通过word_count()函数实现了一个简单的文本词频统计功能,其中filename是待处理的文本文件名,minlen是要统计的词的最小长度,count是要返回的词频排名前几的词语,该函数的返回值是一个按照词频从高到低排名的列表。
我们可以用下面的测试文本进行测试:
This is a test file for Python Counter.
Counter is a powerful Python collection module.
Python collections module provides alternatives to built-in types that can save significant time and space.
输出结果:
[('python', 3), ('collections', 2), ('module', 2), ('counter', 2), ('is', 1), ('powerful', 1), ('collection', 1), ('provides', 1), ('alternatives', 1), ('built-in', 1)]
说明:上述代码统计了长度大于等于5的词语在文本中的词频,排名前10的结果返回一个列表,其中第一项是'python',出现了3次,是出现频率最高的单词。