Counter 是一个容器,它跟踪等效值被添加了多少次。它可用于实现其他语言通常使用包(bag)或多重集(multiset)数据结构的相同算法。
初始化Counter 支持三种形式的初始化。可以调用其构造函数并传入一个项目序列、一个包含键和计数的字典,或者使用将字符串名称映射到计数的关键字参数。
collections_counter_init.py
import collections
print(collections.Counter(['a', 'b', 'c', 'a', 'b', 'b']))
print(collections.Counter({'a': 2, 'b': 3, 'c': 1}))
print(collections.Counter(a=2, b=3, c=1))
所有三种形式的初始化结果都是相同的。
$ python3 collections_counter_init.py
Counter({'b': 3, 'a': 2, 'c': 1})
Counter({'b': 3, 'a': 2, 'c': 1})
Counter({'b': 3, 'a': 2, 'c': 1})
可以不带参数构造一个空的 Counter,并通过 update() 方法填充它。
collections_counter_update.py
import collections
c = collections.Counter()
print('Initial :', c)
c.update('abcdaab')
print('Sequence:', c)
c.update({'a': 1, 'd': 5})
print('Dict :', c)
计数值根据新数据增加,而不是被替换。在前面的例子中,a 的计数从 3 增加到 4。
$ python3 collections_counter_update.py
Initial : Counter()
Sequence: Counter({'a': 3, 'b': 2, 'c': 1, 'd': 1})
Dict : Counter({'d': 6, 'a': 4, 'b': 2, 'c': 1})
访问计数一旦 Counter 被填充,可以使用字典 API 检索其值。
collections_counter_get_values.py
import collections
c = collections.Counter('abcdaab')
for letter in 'abcde':
print('{} : {}'.format(letter, c[letter]))
Counter 不会对未知项引发 KeyError。如果一个值在输入中未出现(如本例中的 e),则其计数为 0。
$ python3 collections_counter_get_values.py
a : 3
b : 2
c : 1
d : 1
e : 0
elements() 方法返回一个迭代器,产生 Counter 已知的所有项目。
collections_counter_elements.py
import collections
c = collections.Counter('extremely')
c['z'] = 0
print(c)
print(list(c.elements()))
元素的顺序不能保证,并且计数小于或等于零的项不包括在内。
$ python3 collections_counter_elements.py
Counter({'e': 3, 'x': 1, 't': 1, 'r': 1, 'm': 1, 'l': 1, 'y': 1, 'z': 0})
['e', 'e', 'e', 'x', 't', 'r', 'm', 'l', 'y']
使用 most_common() 产生一个包含 n 个最常遇到的输入值及其各自计数的序列。
collections_counter_most_common.py
import collections
c = collections.Counter()
with open('/usr/share/dict/words', 'rt') as f:
for line in f:
c.update(line.rstrip().lower())
print('Most common:')
for letter, count in c.most_common(3):
print('{}: {:>7}'.format(letter, count))
此示例统计系统字典中所有单词中出现的字母以产生频率分布,然后打印三个最常见的字母。省略 most_common() 的参数会生成一个所有项的列表,按频率顺序排列。
$ python3 collections_counter_most_common.py
Most common:
e: 235331
i: 201032
a: 199554
算术运算Counter 实例支持算术和集合操作以聚合结果。此示例显示了用于创建新 Counter 实例的标准运算符,但也支持就地运算符 +=、-=、&= 和 |=。
collections_counter_arithmetic.py
import collections
c1 = collections.Counter(['a', 'b', 'c', 'a', 'b', 'b'])
c2 = collections.Counter('alphabet')
print('C1:', c1)
print('C2:', c2)
print('\nCombined counts:')
print(c1 + c2)
print('\nSubtraction:')
print(c1 - c2)
print('\nIntersection (taking positive minimums):')
print(c1 & c2)
print('\nUnion (taking maximums):')
print(c1 | c2)
每次通过操作产生新的 Counter 时,任何计数为零或负数的项都会被丢弃。a 的计数在 c1 和 c2 中是相同的,因此减法使其为零。
$ python3 collections_counter_arithmetic.py
C1: Counter({'b': 3, 'a': 2, 'c': 1})
C2: Counter({'a': 2, 'l': 1, 'p': 1, 'h': 1, 'b': 1, 'e': 1, 't': 1})
Combined counts:
Counter({'a': 4, 'b': 4, 'c': 1, 'l': 1, 'p': 1, 'h': 1, 'e': 1, 't': 1})
Subtraction:
Counter({'b': 2, 'c': 1})
Intersection (taking positive minimums):
Counter({'a': 2, 'b': 1})
Union (taking maximums):
Counter({'b': 3, 'a': 2, 'c': 1, 'l': 1, 'p': 1, 'h': 1, 'e': 1, 't': 1})

