2021年4月30日 / 200次阅读 / 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
前一篇:极坐标和欧拉公式
后一篇:Python中的内存泄露
©Copyright 麦新杰 Since 2019 Python笔记