Python中内建模块collections如何使用


Posted in Python onMay 27, 2020

collections是Python内建的一个集合模块,提供了许多有用的集合类。

这里举几个例子:

namedtuple

我们知道tuple可以表示不变集合,例如,一个点的二维坐标就可以表示成:

>>> p = (1, 2)

但是,看到(1, 2),很难看出这个tuple是用来表示一个坐标的。

定义一个class又小题大做了,这时,namedtuple就派上了用场:

>>> from collections import namedtuple
>>> Point = namedtuple('Point', ['x', 'y'])
>>> p = Point(1, 2)
>>> p.x
1
>>> p.y
2

namedtuple是一个函数,它用来创建一个自定义的tuple对象,并且规定了tuple元素的个数,并可以用属性而不是索引来引用tuple的某个元素。

这样一来,我们用namedtuple可以很方便地定义一种数据类型,它具备tuple的不变性,又可以根据属性来引用,使用十分方便。

可以验证创建的Point对象是tuple的一种子类:

>>> isinstance(p, Point)
True
>>> isinstance(p, tuple)
True

类似的,如果要用坐标和半径表示一个圆,也可以用namedtuple定义:

# namedtuple('名称', [属性list]):
Circle = namedtuple('Circle', ['x', 'y', 'r'])

deque

使用list存储数据时,按索引访问元素很快,但是插入和删除元素就很慢了,因为list是线性存储,数据量大的时候,插入和删除效率很低。

deque是为了高效实现插入和删除操作的双向列表,适合用于队列和栈:

>>> from collections import deque
>>> q = deque(['a', 'b', 'c'])
>>> q.append('x')
>>> q.appendleft('y')
>>> q
deque(['y', 'a', 'b', 'c', 'x'])

deque除了实现list的append()和pop()外,还支持appendleft()和popleft(),这样就可以非常高效地往头部添加或删除元素。

defaultdict

使用dict时,如果引用的Key不存在,就会抛出KeyError。如果希望key不存在时,返回一个默认值,就可以用defaultdict:

>>> from collections import defaultdict
>>> dd = defaultdict(lambda: 'N/A')
>>> dd['key1'] = 'abc'
>>> dd['key1'] # key1存在
'abc'
>>> dd['key2'] # key2不存在,返回默认值
'N/A'

注意默认值是调用函数返回的,而函数在创建defaultdict对象时传入。

除了在Key不存在时返回默认值,defaultdict的其他行为跟dict是完全一样的。

OrderedDict

使用dict时,Key是无序的。在对dict做迭代时,我们无法确定Key的顺序。

如果要保持Key的顺序,可以用OrderedDict:

>>> from collections import OrderedDict
>>> d = dict([('a', 1), ('b', 2), ('c', 3)])
>>> d # dict的Key是无序的
{'a': 1, 'c': 3, 'b': 2}
>>> od = OrderedDict([('a', 1), ('b', 2), ('c', 3)])
>>> od # OrderedDict的Key是有序的
OrderedDict([('a', 1), ('b', 2), ('c', 3)])

注意,OrderedDict的Key会按照插入的顺序排列,不是Key本身排序:

>>> od = OrderedDict()
>>> od['z'] = 1
>>> od['y'] = 2
>>> od['x'] = 3
>>> od.keys() # 按照插入的Key的顺序返回
['z', 'y', 'x']

OrderedDict可以实现一个FIFO(先进先出)的dict,当容量超出限制时,先删除最早添加的Key:

from collections import OrderedDict
class LastUpdatedOrderedDict(OrderedDict):
 def __init__(self, capacity):
  super(LastUpdatedOrderedDict, self).__init__()
  self._capacity = capacity
 def __setitem__(self, key, value):
  containsKey = 1 if key in self else 0
  if len(self) - containsKey >= self._capacity:
   last = self.popitem(last=False)
   print 'remove:', last
  if containsKey:
   del self[key]
   print 'set:', (key, value)
  else:
   print 'add:', (key, value)
  OrderedDict.__setitem__(self, key, value)

Counter

Counter是一个简单的计数器,例如,统计字符出现的个数:

>>> from collections import Counter
>>> c = Counter()
>>> for ch in 'programming':
...  c[ch] = c[ch] + 1
...
>>> c
Counter({'g': 2, 'm': 2, 'r': 2, 'a': 1, 'i': 1, 'o': 1, 'n': 1, 'p': 1})

Counter实际上也是dict的一个子类,上面的结果可以看出,字符'g'、'm'、'r'各出现了两次,其他字符各出现了一次。

小结

collections模块提供了一些有用的集合类,可以根据需要选用。

知识点补充:

在内置数据类型(dict、list、set、tuple)的基础上,collections模块还提供了几个额外的数据类型:Counter、deque、defaultdict、namedtuple和OrderedDict等。

1.namedtuple: 生成可以使用名字来访问元素内容的tuple

2.deque: 双端队列,可以快速的从另外一侧追加和推出对象

3.Counter: 计数器,主要用来计数

4.OrderedDict: 有序字典

5.defaultdict: 带有默认值的字典

以上就是Python中内建模块collections如何使用的详细内容,更多关于详解Python中的内建模块collections的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python 简单的绘图工具turtle使用详解
Jun 21 Python
Python中的默认参数实例分析
Jan 29 Python
Python爬虫实战:分析《战狼2》豆瓣影评
Mar 26 Python
Python3.4 splinter(模拟填写表单)使用方法
Oct 13 Python
Scrapy使用的基本流程与实例讲解
Oct 21 Python
一步步教你用python的scrapy编写一个爬虫
Apr 17 Python
如何在Django项目中引入静态文件
Jul 26 Python
Django CBV与FBV原理及实例详解
Aug 12 Python
Python 转换RGB颜色值的示例代码
Oct 13 Python
Python OpenCV图像指定区域裁剪的实现
Oct 30 Python
python3实现在二叉树中找出和为某一值的所有路径(推荐)
Dec 26 Python
Python 快速验证代理IP是否有效的方法实现
Jul 15 Python
Python OpenCV实现测量图片物体宽度
May 27 #Python
Python中socket网络通信是干嘛的
May 27 #Python
Python中SQLite如何使用
May 27 #Python
Pycharm插件(Grep Console)自定义规则输出颜色日志的方法
May 27 #Python
Python中如何引入第三方模块
May 27 #Python
Python中的wordcloud库安装问题及解决方法
May 27 #Python
Python Dataframe常见索引方式详解
May 27 #Python
You might like
php 提速工具eAccelerator 配置参数详解
2010/05/16 PHP
php数组函数序列之array_combine() - 数组合并函数使用说明
2011/10/29 PHP
PHP输出英文时间日期的安全方法(RFC 1123格式)
2014/06/13 PHP
Linux系统中为php添加pcntl扩展
2016/08/28 PHP
PHP 实现页面静态化的几种方法
2017/07/23 PHP
php+ajax实现无刷新文件上传功能(ajaxuploadfile)
2018/02/11 PHP
javascript this用法小结
2008/12/19 Javascript
Javascript图像处理—平滑处理实现原理
2012/12/28 Javascript
浅析ajax请求json数据并用js解析(示例分析)
2013/07/13 Javascript
自己动手实现jQuery Callbacks完整功能代码详解
2013/11/25 Javascript
js动态创建上传表单通过iframe模拟Ajax实现无刷新
2014/02/20 Javascript
浅谈JavaScript字符串与数组
2015/06/03 Javascript
深入理解JavaScript编程中的原型概念
2015/06/25 Javascript
关于JS中的apply,call,bind的深入解析
2016/04/05 Javascript
JavaScript与Java正则表达式写法的区别介绍
2017/08/15 Javascript
使用async await 封装 axios的方法
2018/07/09 Javascript
vue2.0 element-ui中el-select选择器无法显示选中的内容(解决方法)
2018/08/24 Javascript
jquery.param()实现数组或对象的序列化方法
2018/10/08 jQuery
JS 音频可视化插件Wavesurfer.js的使用教程
2018/10/31 Javascript
JavaScript强制类型转换和隐式类型转换操作示例
2019/05/01 Javascript
[00:27]DOTA2战队VP、Secret贺新春
2018/02/11 DOTA
Python删除指定目录下过期文件的2个脚本分享
2014/04/10 Python
Python3变量与基本数据类型用法实例分析
2020/02/14 Python
Python安装whl文件过程图解
2020/02/18 Python
乌克兰网上服装店:Bolf.ua
2018/10/30 全球购物
国际花店:Pickup Flowers
2020/04/10 全球购物
《我的第一本书》教学反思
2014/02/15 职场文书
国庆节促销广告语2014
2014/09/19 职场文书
民主生活会汇报材料
2014/12/15 职场文书
公司出纳岗位职责
2015/03/31 职场文书
帝企鹅日记观后感
2015/06/10 职场文书
廉洁自律心得体会2016
2016/01/13 职场文书
MySQL中出现乱码问题的终极解决宝典
2021/05/26 MySQL
KVM基础命令详解
2022/04/30 Servers
SQL Server #{}可以防止SQL注入
2022/05/11 SQL Server
vue css 相对路径导入问题级踩坑记录
2022/06/05 Vue.js