Python统计可散列的对象之容器Counter详解
本文详细解析Python中collections.Counter容器的使用方法。涵盖三种初始化方式、空Counter的update填充、字典式访问及elements()迭代器的特性。重点介绍most_common()统计高频元素,并结合英文文档统计示例展示其在NLP中的应用。最后演示Counter容器间的加减交集并集等算术运算,帮助开发者高效处理可散列对象的频率统计。
一、初始化Counter
Counter类支持三种不同的初始化方式:可以传入一个列表(数组),传入一个字典,或者通过关键字参数进行键值对赋值。具体的初始化代码示例如下:
import collections
a = collections.Counter(['a', 'a', 'b', 'b', 'b', 'c'])
b = collections.Counter({"a": 2, "b": 3, "c": 1})
c = collections.Counter(a=2, b=3, c=1)
print(a)
print(b)
print(c)
执行上述代码后,运行结果如下所示:

上述方式是通过构造函数直接填充数据。此外,也可以先创建一个空的Counter实例,随后调用update()方法向其中添加数据。
import collections a = collections.Counter() a.update(['a', 'a', 'b', 'b', 'b', 'c']) print(a)
该方式的运行效果与前述示例a一致,此处不再展示图片,读者可自行测试验证。
二、遍历Counter
经过初始化或更新操作后,Counter容器中已包含若干统计值。由于Counter的输出形式类似于字典,因此可以直接采用字典的访问方式进行读取。
import collections
a = collections.Counter()
a.update(['a', 'a', 'b', 'b', 'b', 'c'])
for key in 'abcde':
print(key, "=", a[key])
运行代码后的效果如下:

从结果可以看出,即使访问Counter中不存在的键,也不会抛出错误,而是返回默认计数值0。
三、elements()
如果需要遍历输出所有元素且排除计数为0的项目,可以使用elements()迭代器。具体实现代码如下:
import collections
a = collections.Counter()
a.update('caabbbc')
print(list(a.elements()))
运行上述代码后,效果如下:

需要注意的是,虽然elements()会忽略计数为0的元素,但它并不保证输出元素的顺序。
四、most_common
most_common()方法可用于生成一个序列,统计出现频率最高的n个元素及其对应的计数。下面通过统计英文文档中字母出现次数的示例来演示具体用法:
import collections
c = collections.Counter()
with open('英文文档.txt', 'rt') as f:
for line in f:
c.update(line.rstrip().lower())
for letter, count in c.most_common(5):
print("{}:{}".format(letter, count))
运行代码后的结果如下:

统计结果显示,英文文档中空格出现次数最多,共计658次,其他字符的计数依次递减。利用Counter生成英文文档中字母的频率分布,可以完美结合到自然语言处理(NLP)任务中进行统计分析。
五、算数操作
Counter容器不仅用于统计频率分布,还支持算术运算。例如,可以将两个Counter容器相加或相减,具体操作如下:
import collections
c1 = collections.Counter('abcbcabds')
c2 = collections.Counter('abcbcabds')
print("原始值:")
print(c1)
print(c2)
print("算数运算后:")
print(c1 + c2)
print(c1 - c2)
print(c1 & c2)
print(c1 | c2)
运行代码后的效果如下:

至此,关于Python统计可散列对象之容器Counter的详解介绍完毕。如需了解更多Python容器Counter相关内容,欢迎搜索本站历史文章或继续浏览后续文章,感谢大家的支持!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









