Python中collections.Counter()的具体使用
本文详细介绍Python标准库中collections模块下的Counter类。Counter用于统计可迭代对象中元素出现的频率,支持通过字符串、字典或关键字参数初始化。文章涵盖Counter的创建方式、元素访问、使用update和subtract进行计数更新、键值删除、elements和most_common方法的使用,以及加减乘除等集合运算操作,帮助开发者高效处理数据统计任务。
Counter类
Counter类的主要功能是统计元素出现的频次。它属于无序容器类型,内部以字典的键值对结构存储数据:元素本身作为键(key),对应的出现次数作为值(value)。这里的计数值可以是任意整数,包括0和负数。Counter类的设计概念与其他语言中的bags或multisets(多重集)非常相似。
创建
Counter是一个容器对象,核心作用在于统计散列对象。初始化Counter对象主要有三种方式。
- 第一种方式:传入可迭代对象。例如Counter("success"),会将字符串中的字符作为元素进行统计。
- 第二种方式:传入关键字参数。例如Counter(s=3, c=2, e=1, u=1),直接指定元素及其对应的计数值。
- 第三种方式:传入字典。例如Counter({"s":3, "c":2, "e":1, "u":1}),通过字典键值对初始化Counter。
以下代码演示了Counter类的三种创建方法:
>>> c = Counter() # 创建一个空的Counter类
>>> c = Counter('gallahad') # 从一个可iterable对象(list、tuple、dict、字符串等)创建
>>> c = Counter({'a': 4, 'b': 2}) # 从一个字典对象创建
>>> c = Counter(a=4, b=2) # 从一组键值对创建
计数值的访问与缺失的键
在访问Counter中的键时,如果该键不存在,不会抛出KeyError异常,而是返回0;如果键存在,则返回其对应的计数值。
>>> c = Counter("abcdefgab")
>>> c["a"]
> 2
>>> c["c"]
> 1
>>> c["h"]
> 0
计数器的更新
可以使用可迭代对象或者另一个Counter对象来更新现有的键值计数。
Counter的更新操作包含增加计数和减少计数两种情况。
增加计数使用update()方法:
>>> c = Counter('which')
>>> c.update('witch') # 使用另一个iterable对象更新
>>> c['h']
> 2
>>> d = Counter('watch')
>>> c.update(d) # 使用另一个Counter对象更新
>>> c['h']
> 3
减少计数则使用subtract()方法:
>>> c = Counter('which')
>>> c.subtract('witch') # 使用另一个iterable对象更新
>>> c['h']
> 1
>>> d = Counter('watch')
>>> c.subtract(d) # 使用另一个Counter对象更新
>>> c['a']
> -1
键的删除
当某个元素的计数值变为0时,该元素并不会从Counter中自动删除。若要彻底删除元素,必须使用del语句显式删除。
>>> c = Counter("abcdcba")
>>> c
Counter({'a': 2, 'c': 2, 'b': 2, 'd': 1})
>>> c["b"] = 0
>>> c
Counter({'a': 2, 'c': 2, 'd': 1, 'b': 0})
>>> del c["a"]
>>> c
Counter({'c': 2, 'b': 2, 'd': 1})
elements()
该方法返回一个迭代器。
迭代器中元素的重复次数等于该元素在Counter中的计数值。元素的排列顺序不确定,且计数值小于1的元素不会被包含在迭代器中。
>>> c = Counter(a=4, b=2, c=0, d=-2)
>>> list(c.elements())
['a', 'a', 'a', 'a', 'b', 'b']
most_common([n])
该方法返回一个包含TopN个元素的列表。如果未指定n,则返回所有元素。当多个元素的计数值相同时,它们的排列顺序是不确定的。
>>> c = Counter('abracadabra')
>>> c.most_common()
[('a', 5), ('r', 2), ('b', 2), ('c', 1), ('d', 1)]
>>> c.most_common(3)
[('a', 5), ('r', 2), ('b', 2)]
fromkeys
这是一个未实现的类方法。
浅拷贝copy
>>> c = Counter("abcdcba")
>>> c
Counter({'a': 2, 'c': 2, 'b': 2, 'd': 1})
>>> d = c.copy()
>>> d
Counter({'a': 2, 'c': 2, 'b': 2, 'd': 1})
算术和集合操作
Counter支持+、-、&、|等运算符。其中&和|运算符分别返回两个Counter对象各元素计数的最小值和最大值。需要注意的是,运算结果生成的Counter对象会自动删除计数值小于1的元素。
>>> c = Counter(a=3, b=1)
>>> d = Counter(a=1, b=2)
>>> c + d # c[x] + d[x]
Counter({'a': 4, 'b': 3})
>>> c - d # subtract(只保留正数计数的元素)
Counter({'a': 2})
>>> c & d # 交集: min(c[x], d[x])
Counter({'a': 1, 'b': 1})
>>> c | d # 并集: max(c[x], d[x])
Counter({'a': 3, 'b': 2})
常用操作
以下是Counter类的一些常用操作,参考自Python官方文档:
sum(c.values()) # 所有计数的总数
c.clear() # 重置Counter对象,注意不是删除
list(c) # 将c中的键转为列表
set(c) # 将c中的键转为set
dict(c) # 将c中的键值对转为字典
c.items() # 转为(elem, cnt)格式的列表
Counter(dict(list_of_pairs)) # 从(elem, cnt)格式的列表转换为Counter类对象
c.most_common()[:-n:-1] # 取出计数最少的n个元素
c += Counter() # 移除0和负值
到此这篇关于Python中collections.Counter()的具体使用的文章就介绍到这了,更多相关Python collections.Counter()内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













