大数跨境
0
0

【Python】collections系列:Counter —可哈希对象 计数

【Python】collections系列:Counter —可哈希对象 计数 我爱数据科学
2025-09-20
0
导读:Counter 是一个容器,它跟踪等效值被添加了多少次。它可用于实现其他语言通常使用包(bag)或多重集(multiset)数据结构的相同算法。




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})


【声明】内容源于网络
0
0
我爱数据科学
精通R语言及Python,传递数据挖掘及可视化技术,关注机器学习及深度学习算法及实现,分享大模型及LangChain的使用技巧。编著多本R语言、python、深度学习等书籍。
内容 322
粉丝 0
我爱数据科学 精通R语言及Python,传递数据挖掘及可视化技术,关注机器学习及深度学习算法及实现,分享大模型及LangChain的使用技巧。编著多本R语言、python、深度学习等书籍。
总阅读84
粉丝0
内容322