python collections.Counter
文章目录
1. 简介
Counter 计数器,顾名思义就是用来计数的,最主要的作用就是计算“可迭代序列中”各个元素(element)的数量。
一个
Counter是一个dict的子类,用于计数可哈希对象。它是一个集合,元素像字典键(key)一样存储,它们的计数存储为值。计数可以是任何整数值,包括0和负数。
引入方式:
from collections import Counter
2. 初始化
一个Counter对象可以从一个iterable被计数或从其他的mapping初始化:
c = Counter() # a new, empty counter
c = Counter('gallahad') # a new counter from an iterable
c = Counter({'red': 4, 'blue': 2}) # a new counter from a mapping
c = Counter(cats=4, dogs=8) # a new counter from keyword args
c = Counter(['a','b','a','c']) # a new counter from a list
从python 3.7开始,Counter也继承了记住插入顺序的功能,进行数学运算时同样会保持该顺序。
3. 取值和修改值
Counter作为dict的子类,具有和dict一致的取值和修改值方式,但也有些细节上不同。
取值方式:
c = Counter(['eggs', 'ham'])
print(c['eggs'])
# 1
特别需要注意的是,若key不在counter对象中,会返回一个0,而不是抛出异常。
c = Counter(['eggs', 'ham'])
print(c['bacon']) # count of a missing element is zero
# 0
但是,若主动将某个计数器设置为0,也不会从counter中将它删除。
c = Counter(['eggs', 'ham'])
c['eggs'] = 0 # counter entry with a zero count
print(dict(c))
# {'eggs': 0, 'ham': 1}
除非使用del语句才会移除该元素。
c = collections.Counter(['eggs', 'ham'])
c['eggs'] = 0 # counter entry with a zero count
print(dict(c))
del c['eggs']
print(dict(c))
# {'eggs': 0, 'ham': 1}
# {'ham': 1}
赋予一个未在counter中的key一个值(即使是0),将添加该key-value到counter中
c = collections.Counter(['eggs', 'ham'])
c['apple'] = 0
print(dict(c))
# {'eggs': 1, 'ham': 1, 'apple': 0}
4. 迭代
其迭代方式和dict一致,迭代时可以将counter当成dict处理。
c = collections.Counter(['eggs', 'ham', 'apple', 'banana'])
for kv in c.items():
print(kv, end=" ")
# ('eggs', 1) ('ham', 1) ('apple', 1) ('banana', 1)
5. 特殊方法
counter对象除了字典的方法外,还提供了其他的方法。
5.1 elements()
返回一个迭代器,其中每个元素将重复出现计数值所指定次。 元素会按首次出现的顺序返回。 如果一个元素的计数值小于一,elements() 将会忽略它。
c = Counter(a=4, b=2, c=0, d=-2)
pritn(sorted(c.elements()))
# ['a', 'a', 'a', 'a', 'b', 'b']
5.2 most_common([n])
返回一个列表,按出现次数排序的前n个元素。 如果 n 被省略或为 None,most_common() 将返回计数器中的 所有 元素。 计数值相等的元素按首次出现的顺序排序:
print(Counter('abracadabra').most_common(3))
# [('a', 5), ('b', 2), ('r', 2)]
5.3 total()
计算总计数值,并返回。
c = Counter(a=10, b=5, c=0)
print(c.total())
# 15
5.4 subtract()
减运算。
a = Counter("aab")
b = Counter('bcc')
a.subtract(b)
print(a)
# Counter({'a': 2, 'b': 0, 'c': -2})
减运算基于以下两步:1. 迭代b中的key,从a中取a[key]。2. a[key] = a[key] - b[key]。因此,上面例子中会出现c:-2的结果(c这个key在a中没出现过,取值a['c']为0)。
注意:减运算会直接修改a中的计数器,且没有返回值。
6. 集合特性
counter也是一个集合,可以进行集合运算。
a = Counter("aab")
b = Counter('bcc')
print(a + b) # 并
print(a - b) # 差
print(a & b) # 与(交)
print(a | b) # 或
# Counter({'a': 2, 'b': 2, 'c': 2})
# Counter({'a': 2})
# Counter({'b': 1})
# Counter({'a': 2, 'c': 2, 'b': 1})
注意这里的差运算,是和数学概念上的集合差运算一致的,即:
A
−
B
=
{
x
∣
x
∈
A
且
x
∉
B
}
A - B = \{x|x\in A\ 且\ x\notin B\}
A−B={x∣x∈A 且 x∈/B}
本文详细介绍了Python的collections.Counter类,包括初始化、取值与修改、迭代、特殊方法如elements(), most_common(), total(), subtract(),以及Counter的集合特性。Counter是一个用于计数的字典子类,可用于快速计算可迭代对象中各元素出现的次数,并提供了丰富的操作方法。

1281

被折叠的 条评论
为什么被折叠?



