- Preface 前言
- 第1章 引论
- 第2章 编程惯用法
- 第3章 基础语法
- 建议19:有节制地使用 from…import 语句
- 建议20:优先使用 absolute import 来导入模块
- 建议21:i+=1 不等于 ++i
- 建议22:使用 with 自动关闭资源
- 建议23:使用 else 子句简化循环(异常处理)
- 建议24:遵循异常处理的几点基本原则
- 建议25:避免 finally 中可能发生的陷阱
- 建议26:深入理解 None 正确判断对象是否为空
- 建议27:连接字符串应优先使用 join 而不是 +
- 建议28:格式化字符串时尽量使用 .format 方式而不是 %
- 建议29:区别对待可变对象和不可变对象
- 建议30:[]、() 和 {}:一致的容器初始化形式
- 建议31:记住函数传参既不是传值也不是传引用
- 建议32:警惕默认参数潜在的问题
- 建议33:慎用变长参数
- 建议34:深入理解 str() 和 repr() 的区别
- 建议35:分清 staticmethod 和 classmethod 的适用场景
- 第4章 库
- 建议36:掌握字符串的基本用法
- 建议37:按需选择 sort() 或者 sorted()
- 建议38:使用 copy 模块深拷贝对象
- 建议39:使用 Counter 进行计数统计
- 建议40:深入掌握 ConfigParser
- 建议41:使用 argparse 处理命令行参数
- 建议42:使用 pandas 处理大型 CSV 文件
- 建议43:一般情况使用 ElementTree 解析 XML
- 建议44:理解模块 pickle 优劣
- 建议45:序列化的另一个不错的选择 JSON
- 建议46:使用 traceback 获取栈信息
- 建议47:使用 logging 记录日志信息
- 建议48:使用 threading 模块编写多线程程序
- 建议49:使用 Queue 使多线程编程更安全
- 第5章 设计模式
- 第6章 内部机制
- 建议54:理解 built-in objects
- 建议55:init() 不是构造方法
- 建议56:理解名字查找机制
- 建议57:为什么需要 self 参数
- 建议58:理解 MRO 与多继承
- 建议59:理解描述符机制
- 建议60:区别 getattr() 和 getattribute() 方法
- 建议61:使用更为安全的 property
- 建议62:掌握 metaclass
- 建议63:熟悉 Python 对象协议
- 建议64:利用操作符重载实现中缀语法
- 建议65:熟悉 Python 的迭代器协议
- 建议66:熟悉 Python 的生成器
- 建议67:基于生成器的协程及 greenlet
- 建议68:理解 GIL 的局限性
- 建议69:对象的管理与垃圾回收
- 第7章 使用工具辅助项目开发
- 第8章 性能剖析与优化
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
建议39:使用 Counter 进行计数统计
计数统计相信大家都不陌生,简单地说就是统计某一项出现的次数。实际应用中很多需求都需要用到这个模型,如检测样本中某一值出现的次数、日志分析某一消息出现的频率、分析文件中相同字符串出现的概率等。这种类似的需求有很多种实现方法。我们逐一来看一下使用不同数据结构时的实现方式。
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论