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中的文件和目录操作实现代码
Mar 13 Python
浅谈Python 中整型对象的存储问题
May 16 Python
pygame 精灵的行走及二段跳的实现方法(必看篇)
Jul 10 Python
python使用邻接矩阵构造图代码示例
Nov 10 Python
pip安装Python库时遇到的问题及解决方法
Nov 23 Python
解决python使用open打开文件中文乱码的问题
Dec 29 Python
Python向Excel中插入图片的简单实现方法
Apr 24 Python
python使用turtle库与random库绘制雪花
Jun 22 Python
python下载微信公众号相关文章
Feb 26 Python
Python实用工具FuckIt.py介绍
Jul 02 Python
python多线程高级锁condition简单用法示例
Nov 07 Python
python实现飞行棋游戏
Feb 05 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
Amazon Prime Video平台《无限住人 -IMMORTAL-》2020年开始TV放送!
2020/03/06 日漫
dedecms中常见问题修改方法总结
2007/03/21 PHP
Optimizer与Debugger兼容性问题的解决方法
2008/12/01 PHP
php ftp文件上传函数(基础版)
2010/06/03 PHP
Zend Framework框架之Zend_Mail实现发送Email邮件验证功能及解决标题乱码的方法
2016/03/21 PHP
php 使用curl模拟ip和来源进行访问的实现方法
2017/05/02 PHP
PHP如何使用cURL实现Get和Post请求
2020/07/11 PHP
js的写法基础分析
2011/01/17 Javascript
js取消单选按钮选中示例代码
2013/11/14 Javascript
escape函数解决js中ajax传递中文出现乱码问题
2014/10/30 Javascript
基于Bootstrap实现的下拉菜单手机端不能选择菜单项的原因附解决办法
2016/07/22 Javascript
利用原生JS自动生成文章标题树的实例
2016/08/22 Javascript
js中利用cookie实现记住密码功能
2020/08/20 Javascript
javascript入门之string对象【新手必看】
2016/11/22 Javascript
Jquery Easyui分割按钮组件SplitButton使用详解(17)
2016/12/18 Javascript
微信小程序 自定义Toast实例代码
2017/06/12 Javascript
基于JavaScript实现飘落星星特效
2017/08/10 Javascript
jQuery实现获取table中鼠标click点击位置行号与列号的方法
2017/10/09 jQuery
webpack+vue中使用别名路径引用静态图片地址
2017/11/20 Javascript
通过实例学习React中事件节流防抖
2019/06/17 Javascript
利用Angular7开发一个Radio组件的全过程
2019/07/11 Javascript
使用apifm-wxapi快速开发小程序过程详解
2019/08/05 Javascript
基于javascript实现日历功能原理及代码实例
2020/05/07 Javascript
Python彩色化Linux的命令行终端界面的代码实例分享
2016/07/02 Python
Python中元组,列表,字典的区别
2017/05/21 Python
Python 解码Base64 得到码流格式文本实例
2020/01/09 Python
Python的in,is和id函数代码实例
2020/04/18 Python
python使用for...else跳出双层嵌套循环的方法实例
2020/05/17 Python
万得城电器土耳其网站:欧洲第一大电子产品零售商
2016/10/07 全球购物
LN-CC美国:伦敦时尚生活的缩影
2019/02/19 全球购物
adidas爱尔兰官方网站:阿迪达斯运动鞋和运动服
2019/11/01 全球购物
应届生文秘专业个人自荐信格式
2013/09/21 职场文书
工作自我评价分享
2013/12/01 职场文书
中文教师求职信
2014/02/22 职场文书
六个一活动实施方案
2014/03/21 职场文书
2014年社区工会工作总结
2014/12/18 职场文书