Python标准库--collections模块的Counter类

96
有苦向瓜诉说
2018.11.26 15:10 字数 641

最近发现Python标准库自带的工具类十分方便,特别是这个collections容器模块,可以用来代替Python的list、tuple、dict、set,而且还提供了更多有用的功能。在collections模块中分别有6个常用的类/函数和3个包装类,这6个常用的类/函数分别是namedtuple(),deque,ChainMap,Counter,OrderedDict,defaultdict。

注:namedtuple()是一个工厂函数,创建的是tuple的子类。

今天就把学习过的计数器Counter类给大家介绍一下,Counter工具能提供快速而且方便的计数功能,如下代码演示了计数的基础操作

>>> cnt = Counter()
>>> for word in ['red', 'blue', 'red', 'green', 'blue', 'blue']:
        cnt[word] += 1
>>> cnt
Counter({'blue': 3, 'red': 2, 'green': 1})

一个 Counter 对象是一个 dict 的子类,用来统计可哈希对象的数量,创建 Counter 的元素可以是可迭代对象或者是一个映射,如下代码展示了如何创建一个 Counter

>>> c = Counter()             # 创建了一个空的Counter对象             
>>> c = Counter('gallahad')               # 用可迭代对象创建了一个Counter对象
>>> c = Counter({'red': 4, 'blue': 2})    # 用映射来创建一个Counter
>>> c = Counter(cats=4, dogs=8)     #用关键字参数创建Counter

返回Couneter对象的所有元素可以使用elements(),由于Counter对象中的的元素是无序的,所以该方法返回的迭代器也是无序的。

>>> c = Counter(a=4, b=2, c=0, d=-2)
>>> sorted(c.elements())
['a', 'a', 'a', 'a', 'b', 'b']

most_common(n)是个返回n个最常见元素和它的计数的函数,如果n被省略或者为None,则返回所有的元素和它的计数。

>>> Counter('abracadabra').most_common(3) 
[('a', 5), ('r', 2), ('b', 2)]

两个Counter可以使用subtract()来相减,但这样之后的结果可能使得计数为0或者负数,例如下面的代码演示了成为负数的情况

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

另外,Counter也可以利用dict的所有方法来进行运算,例如可以使用items()来返回所有的键值对,使用dict()将它转换为一个字典,用clear()来清空一个Counter。

Counter还支持几个数学运算,包括加法和减法,交集和并集。这里交集和并集返回的是对应计数的最小值和最大值。这四个运算可以接受带符号的计数值,但是与substract()不同的是,输出只包括计数值大于0的键值对。

>>> c = Counter(a=3, b=1)
>>> d = Counter(a=1, b=2)
>>> c + d                       # add two counters together:  c[x] + d[x]
Counter({'a': 4, 'b': 3})
>>> c - d                       # subtract (keeping only positive counts)
Counter({'a': 2})
>>> c & d                       # intersection:  min(c[x], d[x])
Counter({'a': 1, 'b': 1})
>>> c | d                       # union:  max(c[x], d[x])
Counter({'a': 3, 'b': 2})

而使用一元运算便是将相当于在运算符的前面加了一个空的Counter对象那个。

>>> c = Counter(a=2, b=-4)
>>> +c
Counter({'a': 2})
>>> -c
Counter({'b': 4})

总之,在Python中做一个简单的计数器使用Counter是非常方便的,每次需要一些集合操作的时候就可以在collections中来思考思考。

欢迎大家关注公众号“计算机视觉与机器学习”


计算机视觉和机器学习
计算机视觉
Web note ad 1