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中的join()方法的使用
May 19 Python
Python函数可变参数定义及其参数传递方式实例详解
May 25 Python
深入浅析ImageMagick命令执行漏洞
Oct 11 Python
Python基于Socket实现的简单聊天程序示例
Aug 05 Python
Python使用正则表达式获取网页中所需要的信息
Jan 29 Python
Python排序算法之选择排序定义与用法示例
Apr 29 Python
对python Tkinter Text的用法详解
Oct 11 Python
解决PyCharm不运行脚本,而是运行单元测试的问题
Jan 17 Python
Python从list类型、range()序列简单认识类(class)【可迭代】
May 31 Python
Pycharm远程调试原理及具体配置详解
Aug 08 Python
python处理excel绘制雷达图
Oct 18 Python
彻底搞懂 python 中文乱码问题(深入分析)
Feb 28 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
解析thinkphp基本配置 convention.php
2013/06/18 PHP
ThinkPHP中I(),U(),$this->post()等函数用法
2014/11/22 PHP
基于PHP后台的Android新闻浏览客户端
2016/05/23 PHP
PHP数组常用函数实例小结
2018/08/20 PHP
js 弹出菜单/窗口效果
2011/10/30 Javascript
javascript创建createXmlHttpRequest对象示例代码
2014/02/10 Javascript
js根据手机客户端浏览器类型,判断跳转官网/手机网站多个实例代码
2016/04/30 Javascript
jQuery实现简单的网页换肤效果示例
2016/09/18 Javascript
微信小程序加载更多 点击查看更多
2016/11/29 Javascript
Node.js中多进程模块Cluster的介绍与使用
2017/05/27 Javascript
vue form表单post请求结合Servlet实现文件上传功能
2021/01/22 Vue.js
在Python中定义和使用抽象类的方法
2016/06/30 Python
Python简单实现两个任意字符串乘积的方法示例
2018/04/12 Python
利用Python实现在同一网络中的本地文件共享方法
2018/06/04 Python
Python3爬虫之urllib携带cookie爬取网页的方法
2018/12/28 Python
wxpython+pymysql实现用户登陆功能
2019/11/19 Python
Tensorflow 定义变量,函数,数值计算等名字的更新方式
2020/02/10 Python
Python带参数的装饰器运行原理解析
2020/06/09 Python
Python局部变量与全局变量区别原理解析
2020/07/14 Python
Python logging模块原理解析及应用
2020/08/13 Python
html5-websocket基于远程方法调用的数据交互实现
2012/12/04 HTML / CSS
html5默认气泡修改的代码详解
2020/03/13 HTML / CSS
Myprotein中国网站:欧洲畅销运动营养品牌
2021/02/11 全球购物
大整数数相乘的问题
2012/07/22 面试题
学生实习介绍信
2014/01/15 职场文书
公益活动邀请函
2014/02/05 职场文书
个人廉洁自律承诺书
2014/03/27 职场文书
技术岗位竞聘演讲稿
2014/05/16 职场文书
2014县政府领导班子三严三实对照检查材料思想汇报
2014/09/26 职场文书
办公经费申请报告
2015/05/15 职场文书
党员转正申请报告
2015/05/15 职场文书
生活委员竞选稿
2015/11/21 职场文书
PyTorch梯度裁剪避免训练loss nan的操作
2021/05/24 Python
深入理解python协程
2021/06/15 Python
一级电子管军用接收机测评
2022/04/05 无线电
nginx设置资源请求目录的方式详解
2022/05/30 Servers