返回介绍

建议39:使用 Counter 进行计数统计

发布于 2024-01-30 22:19:09 字数 2788 浏览 0 评论 0 收藏 0

计数统计相信大家都不陌生,简单地说就是统计某一项出现的次数。实际应用中很多需求都需要用到这个模型,如检测样本中某一值出现的次数、日志分析某一消息出现的频率、分析文件中相同字符串出现的概率等。这种类似的需求有很多种实现方法。我们逐一来看一下使用不同数据结构时的实现方式。

1)使用dict。

>>> some_data = ['a','2',2,4,5,'2','b',4,7,'a',5,'d','a','z']
>>> count_frq = dict()
>>> for item in some_data:
...  if item in count_frq:
...       count_frq[item] +=1
...  else:
...       count_frq[item] = 1
...
>>> print count_frq
{'a': 3, 2: 1, 'b': 1, 4: 2, 5: 2, 7: 1, '2': 2, 'z': 1, 'd': 1}

2)使用defaultdict。

>>> from collections import defaultdict
>>> some_data = ['a','2',2,4,5,'2','b',4,7,'a',5,'d','a','z']
>>> count_frq = defaultdict(int)
>>> for item in some_data:
...  count_frq[item] += 1
...
>>> print count_frq
defaultdict(<type 'int'>, {'a': 3, 2: 1, 'b': 1, 4: 2, 5: 2, 7: 1, '2': 2, 'z
  1, 'd': 1})

3)使用set和list。

>>> some_data = ['a','2',2,4,5,'2','b',4,7,'a',5,'d','a','z']
>>> count_set = set(some_data)
>>> count_list = []
>>> for item in count_set:
...   count_list.append((item,some_data.count(item)))
...
>>> print count_list
[('a', 3), (2, 1), ('b', 1), (4, 2), (5, 2), (7, 1), ('2', 2), ('z', 1), ('d', 1)]

上面的方法都比较简单,但有没有更优雅、更Pythonic的解决方法呢?答案是使用collections.Counter。

>>> from collections import Counter
>>> some_data = ['a','2',2,4,5,'2','b',4,7,'a',5,'d','a','z']
>>> print Counter(some_data)
Counter({'a': 3, 4: 2, 5: 2, '2': 2, 2: 1, 'b': 1, 7: 1, 'z': 1, 'd': 1})

Counter类是自Python2.7起增加的,属于字典类的子类,是一个容器对象,主要用来统计散列对象,支持集合操作+、-、&、|,其中&和|操作分别返回两个Counter对象各元素的最小值和最大值。它提供了3种不同的方式来初始化:

Counter("success")          #
可迭代对象
Counter(s=3,c=2,e=1,u=1)      #
关键字参数
Counter({"s":3,"c":2,"u":1,"e":1})  #
字典

可以使用elements()方法来获取Counter中的key值。

>>> list(Counter(some_data).elements())
['a', 'a', 'a', 2, 'b', 4, 4, 5, 5, 7, '2', '2', 'z', 'd']

利用most_common()方法可以找出前N个出现频率最高的元素以及它们对应的次数。

>>> Counter(some_data).most_common(2)
[('a', 3), (4, 2)]

当访问不存在的元素时,默认返回为0而不是抛出KeyError异常。

>>> (Counter(some_data))['y']
0

update()方法用于被统计对象元素的更新,原有Counter计数器对象与新增元素的统计计数值相加而不是直接替换它们。

subtract()方法用于实现计数器对象中元素统计值相减,输入和输出的统计值允许为0或者负数。

>>> c = Counter("success")   #Counter({'s': 3, 'c': 2, 'e': 1, 'u': 1})
>>> c.update("successfully")   #'s': 3, 'c': 2, 'l': 2, 'u': 2, 'e': 1, 'f': 1, 'y': 1
>>> c              #s
的值为变为6
,为上面s
中对应值的和
Counter({'s': 6, 'c': 4, 'u': 3, 'e': 2, 'l': 2, 'f': 1, 'y': 1})
>>> c.subtract("successfully")
>>> c
Counter({'s': 3, 'c': 2, 'e': 1, 'u': 1, 'f': 0, 'l': 0, 'y': 0})

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文