Python中的collections模块
Python中内置了4种数据类型,包括:list,tuple,set,dict,这些数据类型都有其各自的特点,但是这些特点(比如dict无序)在一定程度上对数据类型的使用产生了约束,在某些使用场景下效率会比较低,比如有时候我们可能需要维护一个有序的字典等情况。 在这种场景下我们可以使用Python内建的collections模块,它包括了很多有用的集合类,合理的使用可以提高我们代码的运行效率。
接下来主要对collections模块中的常用集合类进行介绍,调用collections模块:
from collections import *
defaultdict
dict在使用时,当key值不存在时,直接添加value时会出现错误,使用defaultdict可以很好的规避该错误。defaultdict是对字典类型的补充,它可以给字典的值设置一个类型,当key不存在时可以自动生成相应类型的value。 举例:
from collections import defaultdict
test_data = (
('cat', 2),
('dog', 5),
('sheep', 3),
('cat', 1),
('sheep', 2)
)
test_data_dict = defaultdict(list)
for name, num in test_data:
test_data_dict[name].append(num)
print test_data_dict
orderedDict
在Python3.6之前的字典是无序的,但是有时候我们需要保持字典的有序性,orderDict可以在dict的基础上实现字典的有序性,这里的有序指的是按照字典key插入的顺序来排列,这样就实现了一个先进先出的dict,当容量超出限制时,先删除最早添加的key。 举例:
#orderedDict
original_dict = {'a': 2, 'b': 4, 'c': 5}
for key, value in original_dict.items():
print key, value
ordered_dict = OrderedDict([('a', 2), ('b', 4), ('c', 5)])
for key, value in ordered_dict.items():
print key, value
可以看到orderDict是按照字典创建时的插入顺序来排序。
deque
Python中的list是基于数组实现的,所以,查找容易,但是插入和删除操作时间复杂度较大。 deque就是为了高效实现插入和删除操作的双向列表,适合用于队列和栈,而且线程安全。 list只提供了append和pop方法来从list的尾部插入或者删除元素,deque新增了appendleft/popleft等方法可以更高效的在元素的开头来插入/删除元素。 举例:
from collections import deque
d = deque([1,2,3,4,5])
d.extendleft([0])
print d
d.extend([6,7])
d.popleft()
print d
可以进行双向操作元素,十分方便。
Counter
字典子类,为可以哈希的对象计数。 举例:
from collections import Counter
test_counter_data = ['cat', 'dog', 'sheep', 'cat', 'dog']
counter_data = Counter()
for item in test_counter_data:
counter_data[item] += 1
print counter_data
可以实现对一个对象中的元素进行计数。
namedtuple
元组子类。 我们知道,Python中元组的一个重要特征就是元素不可增删改,而查找tuple元素时一般采取索引。 使用namedtuple(typename, field_name)可以命名tuple中的元素,之后便可使用名字来查找tuple中的值,有点类似于字典中的查找。 举例:
from collections import namedtuple
animal = namedtuple('animal', 'type age')
mark = animal(type='dog', age=2)
print mark.type
使用namedtuple可以提高代码的可读性和文档性。
以上,是collections模块中的常用集合类。
- Unity Application Block 1.2 学习笔记
- 苹果首个自动驾驶专利到底有什么来头?
- 围棋遇上互联网:科技打开优秀传统文化未来之门
- 神经网络开始放飞自我!都是因为架构搜索新算法
- 浏览器缓存问题的解决
- nginx下目录浏览及其验证功能、版本隐藏等配置记录
- Sqlite的多表连接更新
- Enterprise Library 4.1学习笔记6----加密应用程序块
- 浅谈数据库主键策略
- nginx应用总结(1)--基础认识和应用配置
- nginx反向代理tomcat访问时浏览器加载失败,出现 ERR_CONTENT_LENGTH_MISMATCH 问题
- Enterprise Library 4.1学习笔记5----实体验证程序块
- Python防止sql注入
- 电工学PLC编程的入门建议
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- [OHIF-Viewers]医疗数字阅片-医学影像-Module: Panel-自定义面板-中二-Redux&react-redux状态管理详解
- Bitmap的加载和Cache
- Python全栈 Linux基础之2.Linux终端命令简介
- Ubuntu系统 使用与开发 常见异常与解决办法
- 淘宝首页Bug!嵌套滑动及NestedScroll
- 曝光埋点方案:recyclerView中的item曝光逻辑实现
- Android中的动画全解!
- Python 爬取留言板留言(二):多线程版+selenium模拟
- 嵌套滑动通用解决方案--NestedScrollingParent2
- Python 爬取留言板留言(一):单进程版+selenium模拟
- Glide-图片加载框架全解(一)- 基本用法
- Python全栈(六)项目前导之1.Redis介绍及数据类型介绍
- 网络请求框架OkHttp3全解系列(一):OkHttp的基本使用
- 网络请求框架OkHttp3全解系列 - (二)OkHttp的工作流程分析
- 这次,我把Android事件分发机制翻了个遍