collections.Counter的使用

2021年4月30日 / 13次阅读 / Last Modified 2021年4月30日

无意中发现python collections模块中,有一个Counter类,转来用来触及计数场景,还比较好用。比如:

>>> from collections import Counter
>>> a = 'abasdfaqrpqenqpifdnvqefajdvn;kga;'
>>> ca = Counter(a)
>>> ca
Counter({'a': 5, 'q': 4, 'd': 3, 'f': 3, 'n': 3, 'p': 2, 'e': 2, 'v': 2, ';': 2,
 'b': 1, 's': 1, 'r': 1, 'i': 1, 'j': 1, 'k': 1, 'g': 1})
>>> for k,v in ca.items():
...   print(k,v)
...
a 5
b 1
s 1
d 3
f 3
q 4
r 1
p 2
e 2
n 3
i 1
v 2
j 1
; 2
k 1
g 1

按从左到右出现顺序,统计每一个对象的出现次数,输出一个Counter对象,它继承自dict对象。Counter可以一次性统计所有对象,list有个count函数,只能同意某一个,如下对比:

>>> la = list(a)
>>> la.count()
>>> la.count('a')
5

计数统计后,Counter还可以排序,获取most common数据,这真是一个贴心的功能:

>>> ca.most_common(3)
[('a', 5), ('q', 4), ('d', 3)]
>>> ca.most_common(5)
[('a', 5), ('q', 4), ('d', 3), ('f', 3), ('n', 3)]

另一种排序是将重复出现的对象放在一起:

>>> a
'abasdfaqrpqenqpifdnvqefajdvn;kga;'
>>> ''.join(ca.elements())
'aaaaabsdddfffqqqqrppeennnivvj;;kg'
>>> ''.join(sorted(ca.elements()))
';;aaaaabdddeefffgijknnnppqqqqrsvv'

Counter虽然继承自dict,但也有一些稍微不一样的细节,比如del某一个item的时候,dict对象会将此item删除,不可再访问,而Counter对象只是将其计数清0.

>>> d = {'a':1,'b':2}
>>> d
{'a': 1, 'b': 2}
>>> del d['a']
>>> d
{'b': 2}
>>> ca
Counter({'a': 5, 'q': 4, 'd': 3, 'f': 3, 'n': 3, 'p': 2, 'e': 2, 'v': 2, ';': 2,
 'b': 1, 's': 1, 'r': 1, 'i': 1, 'j': 1, 'k': 1, 'g': 1})
>>> del ca['a']
>>> ca
Counter({'q': 4, 'd': 3, 'f': 3, 'n': 3, 'p': 2, 'e': 2, 'v': 2, ';': 2, 'b': 1,
 's': 1, 'r': 1, 'i': 1, 'j': 1, 'k': 1, 'g': 1})
>>> ca['a']
0

del ca['a]后,ca类也没有这个key了,但是ca['a']还可以访问,返回0。其实,访问ca中任何不存在的key,返回都是0。

计数统计场景有的时候,会将几部分的数据汇总,由于Counter继承了dict的update方法,但是update不再是更新数据,而是汇总数据,此功能也非常nice:

>>> ca = Counter('123123123')
>>> ca
Counter({'1': 3, '2': 3, '3': 3})
>>> cb = Counter('234234234')
>>> cb
Counter({'2': 3, '3': 3, '4': 3})
>>> ca.update(cb)
>>> ca
Counter({'2': 6, '3': 6, '1': 3, '4': 3})

ca汇总cb的数据后,2和3都出现了6次!

-- EOF --

本文链接:https://www.pynote.net/archives/3634

相关文章

    留言区

    您的电子邮箱地址不会被公开。 必填项已用*标注


    前一篇:
    后一篇:

    More


    ©Copyright 麦新杰 Since 2019 Python笔记

    go to top