了解Python的collections.Counter类型

一、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次,是出现频率最高的单词。

后端开发标签