使用Counter进行计数统计

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

一、使用dict

​ 首先来看看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': 2, 2: 1, 4: 2, 5: 1, 'b': 1, 7: 1, '5': 1, 'd': 1, 'z': 1}

二、使用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)

结果:

[('5', 1), (2, 1), ('2', 2), (4, 2), (5, 1), (7, 1), ('a', 3), ('z', 1), ('b', 1), ('d', 1)]

三、collections使用

上面的方法都比较简单,但有没有更优雅,更骚气的,更Pythonic的解决方法呢?请看下面的引入defaultdict

1.1 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) # defaultdict(int) # 统计计数
for item in some_data:
count_frq[item] += 1 print(count_frq)

结果:

dict_items([('a', 3), ('2', 2), (2, 1), (4, 2), (5, 1), ('b', 1), (7, 1), ('5', 1), ('d', 1), ('z', 1)])

1.2 Counter

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

from collections import Counter 

some_data = ['a', '2', 2, 4, 5, '2', 'b', 4, 7, 'a', '5', 'd', 'a', 'z']

count_counter = Counter(some_data)  # 统计

print(count_counter) # 结果就出来,就问你强不强

结果:

Counter({'a': 3, '2': 2, 4: 2, 2: 1, 5: 1, 'b': 1, 7: 1, '5': 1, 'd': 1, 'z': 1})

  • Counter不仅可以对列表就行统计,他可以对任何可以迭代的对象进行统计如下:
  1. 可迭代的对象字符串

    Counter("success")  # 可迭代对象
    print(Counter("success"))

    结果:

    Counter({'s': 3, 'c': 2, 'u': 1, 'e': 1})

  2. 关键字参数

Counter(s=3, c=2, e=1, u=1) # 关键字参数
print(Counter(s=3, c=2, e=1, u=1))

结果:

Counter({'s': 3, 'c': 2, 'e': 1, 'u': 1})

  1. 字典
Counter({'s': 3, 'c': 2, 'e': 1, 'u': 1})
print(Counter({'s': 3, 'c': 2, 'e': 1, 'u': 1}))

结果:

Counter({'s': 3, 'c': 2, 'e': 1, 'u': 1})

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

    print(list(Counter(some_data).elements())) # 根据值打印key的次数

    结果:

    ['a', 'a', 'a', '2', '2', 2, 4, 4, 5, 'b', 7, '5', 'd', 'z']

  • 看看一个更骚气的方法,利用most_commo()方法可以找前N个出现频率最高的元素以及他们对应的次数。

    count = Counter(some_data).most_common(2) # 获取前两个频率最高
    print(count)

    结果:

    [('a', 3), ('2', 2)]

  • 当访问不存在的元素是,默认返回0而不是抛出keyError异常

    print(Counter(some_data)["y"])

    结果:

    0

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

    c = Counter("success")
    print(c)

    结果:

    Counter({'s': 3, 'c': 2, 'u': 1, 'e': 1})

    在此基础上进行更新

    c.update("successfully")
    
    print(c)

    Counter({'s': 6, 'c': 4, 'u': 3, 'e': 2, 'l': 2, 'f': 1, 'y': 1})

  • subtract()方法用于实现计数器对象中元素统计值相减,输入输出的统计值允许为0或者负数(在更新的基础上进行相减)

    c = Counter("success")
    print(c)

    结果:

    Counter({'s': 3, 'c': 2, 'u': 1, 'e': 1, 'f': 0, 'l': 0, 'y': 0})

用兴趣的可以自己研究下哦!

使用Counter进行计数统计的更多相关文章

  1. python之计数统计

    前言: 计数统计,简单的说就是统计某一项出现的次数.实际应用中很多需求都需要用到这个模型,如检测样本中某一值出现的次数.日志分析某一消息出现的频率.分析文件中相同字符串出现的概率等等.以下是实现的不同 ...

  2. 利用CSS计数函数counter()实现计数

    要实现li列表计数比较简单,直接设置list-style-type即可,但是要实现非li列表计数该怎么办呢,counter()可以轻松实现 body{counter-reset:section 0 s ...

  3. Log4j/Log4j2自定义Appender来实现日志级别计数统计及监控

    一.简述 本文主要讲如何基于Log4j2来实现自定义的Appender.一般用途是用于Log4j2自带的Appender不足以满足我们的需求,或者需要我们对日志进行拦截统计等操作时,需要我们自定义Ap ...

  4. Counter的数据统计功能

    Counter是dict的子类,一般用于统计,默认排序是从大到小 from collections import Counter # 输入iterable对象即可 str_counter = Coun ...

  5. 利用Python的collections包下Counter的类统计每个数据出现的个数

    from collections import Counter a = [1, 2, 3, 1, 1, 2] result = Counter(a) print result 输出: {1: 3, 2 ...

  6. 【Spark】Spark-shell案例——单词计数统计

    目录 步骤 一.准备本地文件以作测试 二.通过 --master启动本地模式 三.开发scala单词统计代码 步骤 一.准备本地文件以作测试 在第一台机器执行 mkdir -p /export/ser ...

  7. python 黑魔法收集--已结

    awesome python 中文大全 Fabric , pip, virtualenv 内建函数好文 awesome python 奇技淫巧 一句话求阶乘 from functools import ...

  8. 摘选改善Python程序的91个建议

    1.理解Pythonic概念 Pythonic Tim Peters 的 <The Zen of Python>相信学过 Python 的都耳熟能详,在交互式环境中输入import thi ...

  9. 给大家一些改善 Python 程序的 91 个建议

    读了一本还不错的书「编写高质量代码改善 Python 程序的 91 个建议」,大多数的建议是真心不错,我虽然写python也有3年多了,但是有些地方确实没去注意过,特地整理了一下,给大家参考. 我已经 ...

随机推荐

  1. Excel催化剂开源第11波-动态数组函数技术开源及要点讲述

    在Excel催化剂中,大量的自定义函数使用了动态数组函数效果,虽然不是原生的Excel365版效果(听说Excel2019版取消了支持动态数组函数,还没求证到位,Excel365是可以用,但也仅限于部 ...

  2. C#4.0新增功能01 动态绑定 (dynamic 类型)

    连载目录    [已更新最新开发文章,点击查看详细] C# 4 引入了一个新类型 dynamic. 该类型是一种静态类型,但类型为 dynamic 的对象会跳过静态类型检查. 大多数情况下,该对象就像 ...

  3. [PTA] 数据结构与算法题目集 6-7 在一个数组中实现两个堆栈

    //如果堆栈已满,Push函数必须输出"Stack Full"并且返回false:如果某堆栈是空的,则Pop函数必须输出"Stack Tag Empty"(其中 ...

  4. mongodb数据库常用操作的整理

    这是个人在项目中抽取的代码,自己写的utils的通用模块,使用的框架是tronado,包括了数据库的认证,以及增删改查排序,如有特别需要可以联系我或者自己扩展,刚学python不久,仅供参考,例子如下 ...

  5. java练习---3

    //程序员:罗元昊 2017.9.6public class World{ public static void main(String[] args){ double p=3.14,i=5.50; ...

  6. Gordon家族(一)

    引子 Go语言的吉祥物是一只囊地鼠(gopher),由插画师Renee French设计,名叫Gordon,长得这个样子: 在Go官网上(https://golang.google.cn/)的Gord ...

  7. python Django编写接口并用Jmeter测试

    一.环境准备 python3.6.7 Pycharm 二.创建项目 我这里是在Django项目中新建了个APP,目录结构如下图所示: 那么怎么在已有的Django项目中新建APP并进行配置呢: 2.1 ...

  8. 【pip】brew install pip 问题

    Mac 下用 brew install pip 命令安装 pip 时报错: Error: No available formula with the name "pip" Home ...

  9. 【iOS】ARC & MRC

    iOS 项目类型,是 ARC 还是 MRC 未完……

  10. 【Android】SDK Manager 设置代理

    这里是 Mac 系统下,Windows 环境类似.打开 Android SDK Manager, Proxy Settings 设置如下所示: PS: 注意勾选 "Force https:/ ...