Counter是dict子类,用于计数可哈希的对象。元素被作为字典的key存储,它们的计数作为字典的value存储。Counter对象有一个字典接口,如果引用的键没有任何记录,就返回一个0,而不是弹出一个 KeyError
from collections import Counter
cnt = Counter()
for word in ['red', 'blue', 'red', 'green', 'blue', 'blue']:cnt[word] += 1 # 如果键不存在,就返回0
print cnt
输出结果:
Counter({‘blue’: 3, ‘red’: 2, ‘green’: 1})
from collections import Counter
color_list = ['red', 'blue', 'red', 'green', 'blue', 'blue']
cnt = Counter(color_list ) # cnt.clear() 清空哈希字典
print(cnt)
输出结果:
Counter({‘blue’: 3, ‘red’: 2, ‘green’: 1})
在python3.7之后,Counter也具有了有序性, 对Counter对象的数学操作也保持顺序。 结果按照元素第一次在左操作数中出现的时间和在右操作数中出现的顺序排列。
Counter对象除了支持字典的常用方法之外(Counter没有fromkeys方法,其update方法和dict的update效果不一致),还有一些其他方法:
elements()
返回一个迭代器,其中每个元素将重复出现计数值所指定次。 元素会按首次出现的顺序返回。 如果一个元素的计数值小于一,elements() 将会忽略它。
>>> c = Counter(a=4, b=2, c=0, d=-2)
>>> sorted(c.elements())
['a', 'a', 'a', 'a', 'b', 'b']
most_common([n])
返回一个列表,其中包含 n 个最常见的元素及出现次数,按常见程度由高到低排序。 如果 n 被省略或为 None,most_common() 将返回计数器中的 所有 元素。 计数值相等的元素按首次出现的顺序排序:
>>> Counter('abracadabra').most_common(3)
[('a', 5), ('b', 2), ('r', 2)]
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)
>>> c
Counter({
'a': 3, 'b': 0, 'c': -3, 'd': -6})
total()
计算总计数值。
>>> c = Counter(a=10, b=5, c=0)
>>> c.total()
15
update([iterable-or-mapping])
从 迭代对象 计数元素或者 从另一个映射对象 (或计数器) 添加。 像 dict.update() 但是是加上,而不是替换。另外,迭代对象应该是序列元素,而不是一个 (key, value) 对
另外,提供了一些数学操作来组合Counter对象生成多重集Multiset(计数大于零的计数器)。 加法和减法通过添加或减去相应元素的计数来组合计数器。 交集和并集返回相应计数的最小值和最大值。 ==和包含比较判断相应的计数。
>>> c = Counter(a=3, b=1)
>>> d = Counter(a=1, b=2)
>>> c + d # add two counters together: c[x] + d[x]
Counter({
'a': 4, 'b': 3})
>>> c - d # subtract (keeping only positive counts)
Counter({
'a': 2})
>>> c & d # intersection: min(c[x], d[x])
Counter({
'a': 1, 'b': 1})
>>> c | d # union: max(c[x], d[x])
Counter({
'a': 3, 'b': 2})
>>> c == d # equality: c[x] == d[x]
False
>>> c <= d # inclusion: c[x] <= d[x]
False
notes:
-
Counter 类是一个字典的子类,不限制键和值。值用于表示计数,但你实际上 可以 存储任何其他值。
-
most_common() 方法在值需要排序的时候用。
-
原地操作比如 c[key] += 1 , 值类型只需要支持加和减。 所以分数,小数,和十进制都可以用,负值也可以支持。这两个方法 update() 和 subtract() 的输入和输出也一样支持负数和0。
-
Multiset多集合方法只为正值的使用情况设计。输入可以是负数或者0,但只输出计数为正的值。没有类型限制,但值类型需要支持加,减和比较操作。
-
elements() 方法要求正整数计数。忽略0和负数计数
参考:
https://blog.csdn.net/qq_29678299/article/details/89975667
https://docs.python.org/zh-cn/3/library/collections.html?highlight=counter#collections.Counter