python内置模块collections知识点总结


Posted in Python onDecember 19, 2019

python内置模块collections介绍

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

1、namedtuple

python提供了很多非常好用的基本类型,比如不可变类型tuple,我们可以轻松地用它来表示一个二元向量。

>>> v = (2,3)

我们发现,虽然(2,3)表示出了一个向量的两个坐标,但是,如果没有额外说明,又很难直接看出这个元组是用来表示一个坐标的。

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

>>> from collections import namedtuple

>>> Vector = namedtuple('Vector', ['x', 'y'])

>>> v = Vector(2,3)

>>> v.x

2

>>> v.y

3

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

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

我们可以验证创建的Vector对象的类型。

>>> type(v)

<class '__main__.Vector'>

>>> isinstance(v, Vector)

True

>>> isinstance(v, tuple)

True

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

>>> Circle = namedtuple('Circle', ['x', 'y', 'r'])

# namedtuple('名称', [‘属性列表'])

2、deque

在数据结构中,我们知道队列和堆栈是两个非常重要的数据类型,一个先进先出,一个后进先出。在python中,使用list存储数据时,按索引访问元素很快,但是插入和删除元素就很慢了,因为list是线性存储,数据量大的时候,插入和删除效率很低。

deque是为了高效实现插入和删除操作的双向链表结构,非常适合实现队列和堆栈这样的数据结构。

>>> from collections import deque

>>> deq = deque([1, 2, 3])

>>> deq.append(4)

>>> deq

deque([1, 2, 3, 4])

>>> deq.appendleft(5)

>>> deq

deque([5, 1, 2, 3, 4])

>>> deq.pop()

4

>>> deq.popleft()

5

>>> deq

deque([1, 2, 3])

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

3、defaultdict

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

>>> from collections import defaultdict

>>> dd = defaultdict(lambda: 'defaultvalue')

>>> dd['key1'] = 'a'

>>> dd['key1']

'a'

>>> dd['key2'] # key2未定义,返回默认值

'defaultvalue'

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

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

4、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

>>> list(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)

5、ChainMap

ChainMap可以把一组dict串起来并组成一个逻辑上的dict。ChainMap本身也是一个dict,但是查找的时候,会按照顺序在内部的dict依次查找。

什么时候使用ChainMap最合适?举个例子:应用程序往往都需要传入参数,参数可以通过命令行传入,可以通过环境变量传入,还可以有默认参数。我们可以用ChainMap实现参数的优先级查找,即先查命令行参数,如果没有传入,再查环境变量,如果没有,就使用默认参数。

下面的代码演示了如何查找user和color这两个参数。

from collections import ChainMap

import os, argparse

# 构造缺省参数:

defaults = {

  'color': 'red',

  'user': 'guest'

}

# 构造命令行参数:

parser = argparse.ArgumentParser()

parser.add_argument('-u', '--user')

parser.add_argument('-c', '--color')

namespace = parser.parse_args()

command_line_args = { k: v for k, v in vars(namespace).items() if v }

# 组合成ChainMap:

combined = ChainMap(command_line_args, os.environ, defaults)

# 打印参数:

print('color=%s' % combined['color'])

print('user=%s' % combined['user'])

没有任何参数时,打印出默认参数:

$ python3 use_chainmap.py 

color=red

user=guest

当传入命令行参数时,优先使用命令行参数:

$ python3 use_chainmap.py -u bob

color=red

user=bob

同时传入命令行参数和环境变量,命令行参数的优先级较高:

$ user=admin color=green python3 use_chainmap.py -u bob

color=green

user=bob

6、Counter

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

from collections import Counter

>>> s = 'abbcccdddd'

>>> Counter(s)

Counter({'d': 4, 'c': 3, 'b': 2, 'a': 1})

Counter实际上也是dict的一个子类。

7、小结

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

以上就是python内置模块collections介绍的详细内容,感谢大家的学习和对三水点靠木的支持。

Python 相关文章推荐
Ubuntu 14.04+Django 1.7.1+Nginx+uwsgi部署教程
Nov 18 Python
对Python新手编程过程中如何规避一些常见问题的建议
Apr 01 Python
Python读取一个目录下所有目录和文件的方法
Jul 15 Python
python实现FTP服务器服务的方法
Apr 11 Python
Python开发SQLite3数据库相关操作详解【连接,查询,插入,更新,删除,关闭等】
Jul 27 Python
Python初学者需要注意的事项小结(python2与python3)
Sep 26 Python
详解python selenium 爬取网易云音乐歌单名
Mar 28 Python
pycharm new project变成灰色的解决方法
Jun 27 Python
Python多版本开发环境管理工具介绍
Jul 03 Python
Python中import导入不同目录的模块方法详解
Feb 18 Python
python实现canny边缘检测
Sep 14 Python
FP-growth算法发现频繁项集——发现频繁项集
Jun 24 Python
Python操作redis和mongoDB的方法
Dec 19 #Python
Python 实现Serial 与STM32J进行串口通讯
Dec 18 #Python
实现Python与STM32通信方式
Dec 18 #Python
利用pandas将非数值数据转换成数值的方式
Dec 18 #Python
python 浅谈serial与stm32通信的编码问题
Dec 18 #Python
基于numpy中的expand_dims函数用法
Dec 18 #Python
Python.append()与Python.expand()用法详解
Dec 18 #Python
You might like
yii实现CheckBox复选框在同一行显示的方法
2014/12/03 PHP
php实现中文字符截取防乱码方法汇总
2015/04/29 PHP
通过PHP简单实例介绍文件上传
2015/12/16 PHP
使用PHP访问RabbitMQ消息队列的方法示例
2018/06/06 PHP
node.js开发中使用Node Supervisor实现监测文件修改并自动重启应用
2014/11/04 Javascript
初识Node.js
2015/03/20 Javascript
用JavaScript实现页面重定向功能的教程
2015/06/04 Javascript
jQuery EasyUI 获取tabs的实例解析
2016/12/06 Javascript
jQuery焦点图轮播效果实现方法
2016/12/19 Javascript
详解Node.js中exports和module.exports的区别
2017/04/19 Javascript
Vue 菜单栏点击切换单个class(高亮)的方法
2018/08/22 Javascript
记React connect的几种写法(小结)
2018/09/18 Javascript
对angularJs中$sce服务安全显示html文本的实例
2018/09/30 Javascript
微信小程序公用参数与公用方法用法示例
2019/01/09 Javascript
JavaScript+HTML5 canvas实现放大镜效果完整示例
2019/05/15 Javascript
微信小程序云开发如何使用云函数生成二维码
2019/05/18 Javascript
原生js实现拖拽移动与缩放效果
2020/08/24 Javascript
Python使用PyGreSQL操作PostgreSQL数据库教程
2014/07/30 Python
利用Python学习RabbitMQ消息队列
2015/11/30 Python
详解设计模式中的工厂方法模式在Python程序中的运用
2016/03/02 Python
python使用logging模块发送邮件代码示例
2018/01/18 Python
python去除拼音声调字母,替换为字母的方法
2018/11/28 Python
对python中数据集划分函数StratifiedShuffleSplit的使用详解
2018/12/11 Python
pandas DataFrame 交集并集补集的实现
2019/06/24 Python
Flask框架学习笔记之表单基础介绍与表单提交方式
2019/08/12 Python
django 做 migrate 时 表已存在的处理方法
2019/08/31 Python
python实现126邮箱发送邮件
2020/05/20 Python
Python HTMLTestRunner库安装过程解析
2020/05/25 Python
pytorch  网络参数 weight bias 初始化详解
2020/06/24 Python
Marlies Dekkers内衣美国官方网上商店:高端内衣品牌
2018/11/12 全球购物
HomeAway英国:全球领先的度假租赁在线市场
2020/02/03 全球购物
为什么要有struct关键字
2012/05/08 面试题
C#里面如何倒序排列一个数组的元素?
2013/06/21 面试题
工商管理专业学生的自我评价
2013/10/01 职场文书
实习自我评价怎么写
2013/12/02 职场文书
幼儿园运动会入场词
2014/02/10 职场文书