Python Counter 类介绍

Python标准库——collections 模块之 Counter 类

Counter 类是 dict 的子类,用于统计可哈希对象;它本身是一个集合,通过 key-value 形式存储哈希对象(key)以及其对应的计数(value)。

1
2
3
4
5
6
# Counter()
print(Counter())
print(Counter('abcbabcba'))
print(Counter(['a', 'b', 'a', 'c', 'b', 'b']))
print(Counter({'a': 4, 'b': 2}))
print(Counter(a=3, b=6))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 修改计数
c = Counter(['a', 'b', 'a', 'c', 'b', 'b'])
print(c['a'])
print(c['d'])

c['a'] = 5
print(c['a'])

## 将 c 的计数调整为 0
c['c'] = 0
print(c);

## 删除 c
del c['c']
print(c)

## 清空 Counter
c.clear()

elements()

返回一个包含重复元素(如果元素计数为 n,则有 n 个元素)的迭代器,元素的顺序是任意的,且不包含计数少于 1 的元素。

1
2
3
4
5
6
# elements()
c = Counter(a=3, b=0, c=5, d=6)
print(c.elements())

## ['a', 'a', 'a', 'c', 'c', 'c', 'c', 'c', 'd', 'd', 'd', 'd', 'd', 'd']
print(sorted(c.elements()))

most_common([n])

返回一个计数排名前 n 的元素(包含元素及其计数)列表,如果未提供 n 或 n 为 none,则返回所有元素;列表中计数相同的元素顺序是随机的。

1
2
3
4
5
6
7
8
# most_common(n)
c = Counter(a=3, b=0, c=5, d=6)

## [('d', 6), ('c', 5), ('a', 3), ('b', 0)]
print(c.most_common())

## [('d', 6), ('c', 5)]
print(c.most_common(2))

subtract([iterable-or-mapping])

Counter A 中元素的计数减去 Counter B 中同一元素的计数,换句话说就是将两个 Counter 中相同元素的计数进行相减。

1
2
3
4
5
6
7
c = Counter(a=3, b=0, c=5, d=6)

c.subtract('abcca')

c.subtract(Counter(a=1, b=1, c=2))
## Counter({'d': 6, 'c': 3, 'a': 2, 'b': -1})
print(c)

fromkeys(iterable)

该方式 Counter 类暂未实现

update(counter)

将两个 Counter 中相同元素的计数进行相加,并非替换

1
2
3
4
5
6
7
8
# update(counter)
c = Counter(a=3, b=0, c=5, d=6)

c.update('abdeacd')

c.update(Counter(a=1, b=1, c=2, e=3))
## Counter({'c': 7, 'd': 6, 'a': 4, 'e': 3, 'b': 1})
print(c)

Counter 运算

Counter 类支持两个 Counter 进行加(+)、减(-)操作,以及取交(|)、并(&)集。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 数学运算
c = Counter(a=3, b=1, c=1)
d = Counter(a=1, b=2, c=1)

## c+d 的效果与 c.update(d) 类似
print(c+d)

## c-d 的效果与 c.subtract(d) 类似,两者的区别在于 c-d 只会保留计数大于 0 的元素
print(c-d)

## c&d 相当于 min(c[x], d[x])
print(c&d)

## c|d 相当于 max(c[x], d[x])
print(c|d)

一元操作

1
2
3
4
5
6
7
8
9
c = Counter(a=3, b=0, c=-5)

## +c = c-Counter(),效果是移除 Counter 中计数为 0 或负数的元素
print(+c)
print(c-Counter())

## -c = Counter-c,效果是移除 Counter 中计数为 0 或正数的元素
print(-c)
print(Counter()-c)

Counter 转换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
c = Counter(a=3, b=0, c=5, d=6)

# 将 Counter 转换为 list
list(c) ## ['a', 'b', 'c', 'd']

# 将 Counter 转换为 set
set(c) ## {'c', 'b', 'd', 'a'}

# 将 Counter 转换为 dict
dict(c) ## {'a': 3, 'b': 0, 'c': 5, 'd': 6}

# 将 Counter 转换为包含 (elem, cnt) 的列表
c.items() ## dict_items([('a', 3), ('b', 0), ('c', 5), ('d', 6)])

# 将 (elem, cnt) 列表转换为 Counter
Countert(dict(list_of_pairs))