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实现2048小游戏
Mar 30 Python
Python的Django框架中settings文件的部署建议
May 30 Python
Python模拟脉冲星伪信号频率实例代码
Jan 03 Python
浅谈pandas用groupby后对层级索引levels的处理方法
Nov 06 Python
解决在Python编辑器pycharm中程序run正常debug错误的问题
Jan 17 Python
python实现Virginia无密钥解密
Mar 20 Python
Python 实现文件读写、坐标寻址、查找替换功能
Sep 11 Python
python科学计算之scipy——optimize用法
Nov 25 Python
对Tensorflow中Device实例的生成和管理详解
Feb 04 Python
浅谈django框架集成swagger以及自定义参数问题
Jul 07 Python
Python利用imshow制作自定义渐变填充柱状图(colorbar)
Dec 10 Python
详细介绍python类及类的用法
May 31 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
人大复印资料处理程序_查询篇
2006/10/09 PHP
php 3行代码的分页算法(求起始页和结束页)
2009/10/21 PHP
PHP实现webshell扫描文件木马的方法
2017/07/31 PHP
JavaScript脚本语言在网页中的简单应用
2007/05/13 Javascript
js parsefloat parseint 转换函数
2010/01/21 Javascript
50个比较实用jQuery代码段
2011/09/18 Javascript
使用phantomjs进行网页抓取的实现代码
2014/09/29 Javascript
jquery获取radio值(单选组radio)
2014/10/16 Javascript
JavaScript实现选择框按比例拖拉缩放的方法
2015/08/04 Javascript
javascript检查某个元素在数组中的索引值
2016/03/30 Javascript
JS控制层作圆周运动的方法
2016/06/20 Javascript
JavaScript兼容浏览器FF/IE技巧
2016/08/14 Javascript
JS防止网页被嵌入iframe框架的方法分析
2016/09/13 Javascript
Angular2中select用法之设置默认值与事件详解
2017/05/07 Javascript
详解Vue开发微信H5微信分享签名失败问题解决方案
2018/08/09 Javascript
浅谈Vue render函数在ElementUi中的应用
2018/09/06 Javascript
vue实现的网易云音乐在线播放和下载功能案例
2019/02/18 Javascript
vue和H5 draggable实现拖拽并替换效果
2020/07/29 Javascript
vue项目实现多语言切换的思路
2020/09/17 Javascript
Python函数any()和all()的用法及区别介绍
2018/09/14 Python
python 实现将多条曲线画在一幅图上的方法
2019/07/07 Python
对Django的restful用法详解(自带的增删改查)
2019/08/28 Python
树莓派极简安装OpenCv的方法步骤
2019/10/10 Python
python实现WebSocket服务端过程解析
2019/10/18 Python
Python 实现将numpy中的nan和inf,nan替换成对应的均值
2020/06/08 Python
常用的10个Python实用小技巧
2020/08/10 Python
CSS3利用text-shadow属性实现多种效果的文字样式展现方法
2016/08/25 HTML / CSS
Html5大文件断点续传实现方法
2015/12/05 HTML / CSS
斐乐美国官方网站:FILA美国
2019/03/01 全球购物
大学生志愿者感言
2014/01/15 职场文书
职工运动会邀请函
2014/02/02 职场文书
竞选生活委员演讲稿
2014/04/28 职场文书
幼儿园六一儿童节活动方案
2014/08/26 职场文书
大学生赌博检讨书
2014/09/22 职场文书
2015年幼儿园教研活动总结
2015/03/25 职场文书
2015年依法行政工作总结
2015/04/29 职场文书