collections模块实现了特定目标的容器,以提供Python标准内建容器 dict , list , set , 和 tuple 的替代选择。
包含namedtuple
、deque
、ChainMap
、Counter
、OrderedDict
、defaultdict
等。
本章讲解Counter
,基于python3.10。
简介
class collections.Counter([iterable-or-mapping])
Counter 是一个 dict 的子类,用于计数可哈希对象。它是一个集合,元素像字典键(key)一样存储,它们的计数存储为值。计数可以是任何整数值,包括0和负数。
Counter对象有一个字典接口,如果引用的键没有任何记录,就返回一个0,而不是弹出一个 KeyError 。
Counter元素可以从一个 iterable 被计数或从其他的 mapping (or counter)初始化:
如下一个简单示例:
from collections import Counter
# 列表计数
L = ['red', 'blue', 'red', 'green', 'blue', 'blue']
print(Counter(L)) # Counter({'red': 2, 'blue': 3, 'green': 1}
# 字符串计数
Counter('gallahad')
print(Counter(L)) # ounter({'g': 1, 'a': 3, 'l': 2, 'h': 1, 'd': 1})
# 字典计数
Counter({'red': 4, 'blue': 2})
特殊方法
计数器对象除了字典方法以外,还提供了一些特有方法:
1.elements()
返回一个迭代器,其中每个元素将重复出现计数值所指定次。元素会按首次出现的顺序返回。如果一个元素的计数值小于1,elements() 将会忽略它。
c = Counter(a=4, b=2, c=0, d=-2)
print(list(c.elements()))
print(sorted(c.elements()))
# ['a', 'a', 'a', 'a', 'b', 'b']
2.most_common([n])
返回一个列表,其中包含 n 个最常见的元素及出现次数,按常见程度由高到低排序。 如果 n 被省略或为 None,most_common() 将返回计数器中的 所有 元素。 计数值相等的元素按首次出现的顺序排序。
print(Counter('abracadabra').most_common(3))
# [('a', 5), ('b', 2), ('r', 2)]
3.subtract([iterable-or-mapping])
从 迭代对象 或 映射对象 减去元素。像 dict.update() 但是是减去,而不是替换。输入和输出都可以是0或者负数。
c = Counter(a=4, b=2, c=0, d=-2)
d = Counter(a=1, b=2, c=3, d=4)
c.subtract(d)
print(c)
# Counter({'a': 3, 'b': 0, 'c': -3, 'd': -6})
4.total()
计算总计数值。
print(Counter(a=10, b=5, c=3).total()) # 18
# 相当于sum(Counter(a=10, b=5, c=3).values())
注意:
通常字典方法都可用于 Counter 对象,除了有两个方法工作方式与字典并不相同:
Counter 对象没有fromkeys(iterable)
方法;
update([iterable-or-mapping])
是更新加上元素的计数,而不是字典的更新。
数学操作
python 3.10 新增加了相等性、子集和超集关系等富比较运算:==
,!=
, <
, <=
, >
, >=
。
在 3.10 版更改: 在相等性检测中,不存在的元素会被当作计数值为零。 在此之前,Counter(a=3) 和 Counter(a=3, b=0) 会被视为不同。
示例:
c = Counter(a=3, b=-1, c=-2)
d = Counter(a=6, b=2, c=-4)
print(c + d) # Counter({'a': 9, 'b': 1})
print(c - d) # Counter({'c': 2}),如果元素相减结果小于等于0,就会删除元素
print(c & d) # Counter({'a': 3}),数字符号比较,异号会删除元素
print(c | d) # 数字或比较,如果两个都是符号,删除元素,否则取较大元素
print(c == d) # False
print(c >= d) # False ,元素按照顺序比较,如果相等比较下一个
还增加了一元操作符,意思是从空计数器加或者减去。:
c = Counter(a=2, b=-4)
print(+c)
# 相当于
print(Counter() + c)
print(-c)
# 相当于
print(Counter() - c)