python3 collections.Counter

本文详细介绍了Python内置模块collections中的Counter类,它是一种用于计数的高性能数据结构。Counter可以通过字符串、列表等初始化,支持直接访问、更新、删除元素,以及与其他Counter对象进行加减、交并等操作。此外,还展示了如何使用Counter进行词频统计、数据操作等实用功能。

python3 collections.Counter

collections

collections是Python中的一种数据类型(结构),Python官方文档中将其描述为:

High-performance container datatypes(高性能容器数据类型)

collections中包含了以下内容:

1.namedtuple(): 生成可以使用名字来访问元素内容的tuple子类
2.deque: 双端队列,可以快速的从另外一侧追加和推出对象
3.Counter: 计数器,主要用来计数
4.OrderedDict: 有序字典
5.defaultdict: 带有默认值的字典

注意:collections为Python内置模块,不需要单独安装,直接 import 即可使用
这里我们将对collections.Counter()进行一些简单的介绍和用例展示。

collections.Counter

从语义上来看,collections.Counter()可以看成是一个计数器,它可以的对象包括元组(tuple)、字符串(str)、数组(array)、列表(list)等,并提供了很多方便快捷的操作运算。

1. 创建Counter对象

用字符串初始化Counter

	from collections import Counter
	a = Counter('aaasdfhasdfbnvf')
	print(a)
	print(type(a))

运行结果
在f这里插入图片描述
用List进行Counter的初始化

	fruit = Counter(['apple','orange','pear','apple','orange','apple'])
	print(fruit)

输出结果 Counter({'apple': 3, 'orange': 2, 'pear': 1})

可以看到Counter对象的存储数据与字典相似(事实上,collections为dict的一个子类),通过key-value的方式存储,其中key为出现的数据单元,value为出现次数(Counter本身作为统计、计数的操作)

2. Counter对象的访问

Counter可以直接通过key值访问数据,获得对应的value,当key在Counter中不存在时,返回0

	>>>a['a']
	4
	>>>a['n']
	1
	>>>a[0]
	0

列出所有的键值(并排序)

	>>>a.keys()
	dict_keys(['a', 's', 'd', 'f', 'h', 'b', 'n', 'v'])
	>>>sorted(a)
	['a', 'b', 'd', 'f', 'h', 'n', 's', 'v']

获取出现次数最高的三个字母(词频统计)

	>>>a.most_common(3)
	[('a', 4), ('f', 3), ('s', 2)]

更新Counter数据信息

	>>>a['a'] = 12
	>>>a
	Counter({'a': 12, 's': 2, 'd': 2, 'f': 3, 'h': 1, 'b': 1, 'n': 1, 'v': 1})
	>>>for e in "ahdfiahf":
	>>>    a[e] = a[e] - 1
	>>>a
	Counter({'a': 10,
         's': 2,
         'd': 1,
         'f': 1,
         'h': -1,
         'b': 1,
         'n': 1,
         'v': 1,
         'i': -1})
     >>>a['h']
     -1
3. Counter对象的删除

前面我们可以看到当某一个元素不存在于Counter中时,我们通过该元素key的形式访问得到的结果是0,另一方面当我们把本来存在于Counter中的元素的value减至0(或者直接赋值为),我们再次访问这个key时,结果同样为0;因此当访问一个元素的value返回结果为0时,存在两种可能,值本身为0或不存在。

	>>>a
	Counter({'a': 10,'s': 2,'d': 1,'f': 1,'h': -1,'b': 1,'n': 1,'v': 1,'i': -1})
	>>>a['s'] = 0
	>>>a
	Counter({'a': 10,'s': 0,'d': 1,'f': 1,'h': -1,'b': 1,'n': 1,'v': 1,'i': -1})
	>>>del a['s']
	>>>a
	Counter({'a': 10, 'd': 1, 'f': 1, 'h': -1, 'b': 1, 'n': 1, 'v': 1, 'i': -1})

通过上面的例子,我们可以清楚地看到将元素赋值为0和删除元素对象的区别,前者只是将元素值更新为0,后者则将元素从Counter中移除。

清空Couter对象

	>>>a.clear()
	>>>a
	Counter()
4. 两个Counter对象的操作

Counter提供了两个对象之间的运算操作

	>>>aa = Counter("aaaaabbbccdef")
	>>>bb = Counter("abbdccddefgh")
	>>>aa
	Counter({'a': 5, 'b': 3, 'c': 2, 'd': 1, 'e': 1, 'f': 1})

	>>>bb
	Counter({'a': 1, 'b': 2, 'd': 3, 'c': 2, 'e': 1, 'f': 1, 'g': 1, 'h': 1})
+ 运算

对两个Counter对象进行并(Union)操作
运算结果中的元素key值为两个Counter对象的并集,对应的value值为两个Couunter中相应value值`相加,未出现则按照0参与运算

	>>>c = aa + bb
	>>>c
	Counter({'a': 6, 'b': 5, 'c': 4, 'd': 4, 'e': 2, 'f': 2, 'g': 1, 'h': 1})
- 运算

对两个Counter对象进行操作

	>>>d1 = aa - bb
	>>>d1
	Counter({'a': 4, 'b': 1})

运算结果Counter中的元素一定是在aa中出现过且未在bb中出现过的,同时对应元素的value相减,如果结果小于等于0,同样不会出现在结果中
注意:由于操作的运算性质,aa -bbbb -aa 得到的结果不一样

	>>>d2 = bb - aa
	>>>d2
	Counter({'d': 2, 'g': 1, 'h': 1})
| 运算

运算结果中的元素key值为两个Counter对象的并集,对应的value值为两个Couunter中相应key的value取最大(max)值,未出现则按照0参与运算,+ 运算则是二者相应value相加`,这是二者最显著的区别。

	>>>ae = aa | bb
	>>>ae
	Counter({'a': 5, 'b': 3, 'c': 2, 'd': 3, 'e': 1, 'f': 1, 'g': 1, 'h': 1})
& 运算,

运算结果中的元素key值为两个Counter对象的交集,对应的value值为两个Couunter中相应key的最小(min)值- 运算则是二者相应value相减,且相减结果小于等于0则不出现在结果中,这是二者最显著的区别。

	>>>bd = aa & bb
	>>>bd
	Counter({'a': 1, 'b': 2, 'c': 2, 'd': 1, 'e': 1, 'f': 1})
Python 中,`collections.Counter` 是一个非常强大且实用的工具类,用于统计可迭代对象中元素的出现次数。其设计目的是提供一种高效、简洁的方式来处理计数问题,适用于数据分析、文本处理、算法优化等多个场景。 ### 基本用法 可以通过多种方式创建 `Counter` 对象,例如传入列表、字符串、元组等可哈希对象: ```python from collections import Counter # 统计列表中元素的出现次数 c1 = Counter(['apple', 'banana', 'apple', 'orange', 'banana', 'banana']) # 输出: Counter({'banana': 3, 'apple': 2, 'orange': 1}) # 统计字符串中字符的出现次数 c2 = Counter('abracadabra') # 输出: Counter({'a': 5, 'b': 2, 'r': 2, 'c': 1, 'd': 1}) ``` ### 更新计数器 可以使用 `update()` 方法向已有的 `Counter` 对象中添加新的数据: ```python c1.update(['apple', 'grape']) # 输出: Counter({'banana': 3, 'apple': 3, 'orange': 1, 'grape': 1}) ``` ### 获取最常见元素 `most_common(n)` 方法返回一个包含最多出现元素的列表,按频率降序排列: ```python top_two = c1.most_common(2) # 输出: [('banana', 3), ('apple', 3)] ``` ### 集合运算 `Counter` 支持类似集合的操作,如加法、减法、交集和并集: ```python c3 = Counter(a=3, b=1) c4 = Counter(a=1, b=2) # 加法 c_add = c3 + c4 # Counter({'a': 4, 'b': 3}) # 减法 c_sub = c3 - c4 # Counter({'a': 2}) # 交集(取最小) c_and = c3 & c4 # Counter({'a': 1, 'b': 1}) # 并集(取最大) c_or = c3 | c4 # Counter({'a': 3, 'b': 2}) ``` ### 示例:统计词频并更新计数 以下是一个完整的示例程序,展示如何初始化 `Counter`、更新数据并获取高频词: ```python from collections import Counter words = ['hello', 'world', 'hello', 'python'] word_counter = Counter(words) new_words = ['hello', 'programming'] word_counter.update(new_words) print(word_counter.most_common(2)) # 输出: [('hello', 3), ('world', 1)] 或类似结果 ``` ### 总结 `collections.Counter` 提供了丰富的功能来处理计数任务,包括初始化、更新、获取高频项以及执行集合操作。熟练掌握其用法能够显著提升代码效率与可读性[^1]。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值