​ collections模块主要实现了一些container datatypes(容器类型),作为builtin容器类型dict、list、set和tuple等的一个补充,包括以下新定义的容器类型:

类型 用途
namedtuple() factory function for creating tuple subclasses with named fields
deque 双端队列,支持两端快速出入队列操作
ChainMap 将多个mapping 对象组合成一个mapping对象
Counter dict subclass,用来计数hashable对象
OrderedDict dict subclass that remembers the order entries were added
defaultdict dict subclass,对dict中missing的key,调用一个指定的factory function
UserDict wrapper around dictionary objects for easier dict subclassing
UserList wrapper around list objects for easier list subclassing
UserString wrapper around string objects for easier string subclassing

chainMap

chainMap(*maps)用于连接多个mapping对象称为一个mapping,通常其速度快于使用字典的update方法连接。其构造方法为collections.ChainMap(*maps),当不传入参数时,ChainMap则会产生一个空dict;ChainMap底层用list存储mapping对象,并且可以通过.maps属性对mapping对象进行修改,对mapping对象的修改能够即时反应到ChainMap对象;查找会依次搜索每一个mapping对象,而修改、删除、新增只会在第一个mapping对象上进行操作。

​ ChainMap对象除了支持所有的mapping对象方法,还有以下几个特有的属性、方法:

  • maps

    如上所述,返回ChainMap所包装的mapping对象所组成的list,该list至少包含一个mapping对象;

  • new_child(m=None)

    创建child context,等价于ChainMap(m, *d.maps),当mNone时,等价于ChainMap({}, *d.maps)

  • parents

    返回parent context,即返回除了第一个mapping对象之外的所有mapping对象组成的ChainMap对象

    举个简单的例子:

    >>> baseline = {'music': 'bach', 'art': 'rembrandt'}
    >>> adjustments = {'art': 'van gogh', 'opera': 'carmen'}
    >>> from collections import ChainMap
    >>> a = ChainMap(adjustments, baseline)
    >>> a['art']
    'van gogh'
    

Counter

Counter([iterable-or-mapping])类用于快速、方便的计数,使用频率很高的一个功能,它继承于dict,用于计数可哈希的对象,计数的数值可以是正整数、负整数和零,实例化方法有以下几种:

>>> c = Counter()                           # a new, empty counter
>>> c = Counter('gallahad')                 # a new counter from an iterable
>>> c = Counter({'red': 4, 'blue': 2})      # a new counter from a mapping
>>> c = Counter(cats=4, dogs=8)             # a new counter from keyword args

Counterdict不同之处在于如果Counter检索一个不存在的key时不会抛出KeyError,而是返回0:

>>> c = Counter(['eggs', 'ham'])
>>> c['bacon']                              # count of a missing element is zero
0
>>> del c['eggs']

​ 除了支持父类dict大部分的方法(不支持fromkeys(iterable)以及update([*iterable-or-mapping*])略有不同),还包括以下几个:

  • elements()

    返回一个iterator对象,每个元素重复其计数数值的次数(如果计数数值小于1,就忽略它)

    >>> c = Counter(a=4, b=2, c=-1, d=-2)
    >>> c.elements()
    >>> list(c.elements())  # If an element’s count is less than one, elements() will ignore it.<itertools.chain at 0x112f1be10>
    ['a', 'a', 'a', 'a', 'b', 'b']
    
  • most_common(n)

    返回计数最大的n个元素

    >>> c.most_common(2)
    c.most_common(2)>>> c.most_common()[:-3:-1] # c.most_common()[:-n-1:-1] n least common elements
    
  • subtract()

    执行计数减法操作,加法可以使用update()方法

    >>> c.subtract(Counter(a=1, b=2, c=3, d=4))
    >>> c
    >>> c.update({'a':3})  # update([iterable-or-mapping]), 添加式的update
    >>> cCounter({'a': 3, 'b': 0, 'c': -4, 'd': -6})
    Counter({'a': 6, 'b': 0, 'c': -4, 'd': -6})
    

    Counter还支持一些数学运算符,进行简便的运算:

    >>> c = Counter(a=-3, b=5, c=4)
    >>> d = Counter(a=-1, b=2, c=0)
    >>> c + d                       # add two counters together:  c[x] + d[x] (keeping only positive counts)
    Counter({'b': 7, 'c': 4})
    >>> c - d                       # subtract (keeping only positive counts)
    Counter({'b': 3, 'c': 4})
    >>> c & d                       # intersection:  min(c[x], d[x]) (keeping only positive counts)
    Counter({'b': 2})
    >>> c | d                       # union:  max(c[x], d[x]) (keeping only positive counts)
    Counter({'b': 5, 'c': 4})# 特殊的是,还提供两个shortcuts来表示空的Counter()加上或减去Counter对象
    >>> c = Counter(a=2, b=-4)
    >>> +c  # 相当于 Counter() + c
    Counter({'a': 2})
    >>> -c  # 相当于 Counter() - c
    Counter({'b': 4})
    

deque

collections.deque([iterable[, maxlen]]),以一个iterable对象作为参数进行初始化,得到一个双端队列。双端队列支持从任一侧线程安全,内存高效的appendpop操作,并且复杂度为时间O(1)。如果未指定maxlen或为None,则双端队列的长度可以增长到任意大小;反之,双端队列会限制为指定的最大长度。一旦限定长度的双端队列达到最大长度时,若再插入新的item,则队列另一端会自动丢弃相应数量的item。

  • 方法和属性

    • append(x)、appendleft(x) 插入元素,前者插到队列右边,后者插入到左边
    • extend(iterable)、extendleft(iterable) 插入多个元素,前者插到队列右边,后者插入到左边
    • pop()、popleft() 去除并返回最左(右)边的元素
    • clear() 清空队列
    • copy() 队列浅拷贝(同copy.copy(d)),深拷贝使用copy.deepcopy(d)
    • count(x) 计数队列中与x大小相等的元素个数
    • index(x[, start[, stop]]) 在[start, stop)范围内查找与x相等的第一个元素的index,如果没找到抛出ValueErrorc错误
    • insert(i, x) 在位置i插入x,若i位置超出队列指定的最大长度,引发IndexError
    • remove(value) 去除第一个与value相等的元素,若不存在引发ValueError
    • reverse() in place的反转队列元素
    • rotate(n=1) n> 0, 队列向右移n步,反之向左移
    • maxlen,这是一个只读属性

    除了以上的属性方法, deques 还支持iteration, pickling, len(d), reversed(d), copy.copy(d), copy.deepcopy(d), in 操作符 以及索引操作,如d[-1]. 索引队列两边的元素复杂度都是O(1),当索引获取中间的元素复杂度会是O(n), 因此涉及大量中间元素索引操作的场景应该使用list。

  • 应用举例

    比如获取一个文件的后N行可以采用以下方式:

    def tail(filename, n=10):with open(filename) as f:return deque(f, n)
    

defaultdict

​ 关于defaultdict,我们可以先看一下dict中一个类似功能的函数setdefault(k, d=None):

d = {}
s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]for k, v in s:d.setdefault(k, []).append(v)sorted(d.items())
[('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]

​ 在上述代码中,setdefault(k, d=[])一句话相当于做了两件事情:一是获取key为k的的value,二是若该key不存在则设置其值为[]。即,d.get(k, [])以及如果key不存在就设置d[k] = []。现在再回到defaultdictdefaultdict([default_factory[, ...]]),构造方法中default_factory默认是Nonedefaultdictdict的一个subclass,它重写了一个__miss__方法以及拥有一个default_factory属性。

  • __miss__(key)

    • 该方法在当key不存在时才会且仅被__getitem__()调用,所以当使用dict.get()方法获取一个不存在的键值时,返回结果为None,而不是使用default_factory

    • default_factoryNone时,索引一个不存在的key会引发KeyError异常;

    • default_factory不为None时,索引一个不存在的key则使用default_factory进行初始化并返回值

      >>> from collections import defaultdict>>> d2 = defaultdict(int ,a=1, b=2)
      >>> d2['c']
      0>>> d2 = defaultdict(int ,a=1, b=2)
      >>> d2.get('c')
      None
      >>> d2
      defaultdict(int, {'a': 1, 'b': 2})>>> d1 = defaultdict(a=1, b=2)
      >>> d1['c']
      KeyError: 'c'
      
  • default_factory

    该属性在上述__miss__()函数中使用,由构造函数中的default_factory初始化,默认为None

    ​ 因此,上述例子可以使用defaultdict来实现如下:

    s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
    d = defaultdict(list)
    for k, v in s:d[k].append(v)sorted(d.items())
    [('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]
    

namedtuple

namedtuple用来构造带字段名的元组namedtuple的实例和普通元组消耗的内存一样多,因为字段名都被存在对应的类里面。这个类跟普通的对象实例比起来也要小一些,因为 Python 不会用 __dict__ 来存放这些实例的属性。它们可以在使用常规tuple的任何地方使用,并且它们还具有按名称(tuple只能按index)访问字段的能力。其构造函数为:collections.namedtuple(typename, field_names,*, rename=False, defaults=None, module=None),简单例子如下:

>>> # Basic example
>>> Point = namedtuple('Point', ['x', 'y'])
>>> p = Point(11, y=22)     # instantiate with positional or keyword arguments
>>> p[0] + p[1]             # indexable like the plain tuple (11, 22)
33
>>> x, y = p                # unpack like a regular tuple
>>> x, y
(11, 22)
>>> p.x + p.y               # fields also accessible by name
33
>>> p                       # readable __repr__ with a name=value style
Point(x=11, y=22)

OrderedDict

OrderedDict和一般的dict类似,但是还具有记忆字典中存储的key的插入顺序。但是现在OrderDict可能用处不大了,因为从Python 3.7开始,一般的dict也具有这个特性。但是,dictOrderedDict依旧有些区别:

  • 对于常规dict,最重要的高效的mapping operations,而Track 插入顺序是次要的;
  • 对于OrderedDict,最重要的是排序操作,而空间效率、迭代效率以及更新字典的性能是次要的;
  • OrderedDict可以处理频繁的需要重排的操作,适合于Track最近的操作;
  • 判断两个OrderedDict是否相等同时要求顺序也相同;
  • OrderedDictpopitem(last=True)中可以通过last参数控制pop哪一端的元素;
  • OrderedDictmove_to_end(key, last=True)可以高效的将元素移至末尾;
  • 直到Python3.8,dict没有__reversed__()方法;

UserDict & UserList & UserString

UserDict & UserList & UserString分别是dictliststr的一个wrapper,在实际应用中,已经很少使用到它们了,因为我们可以直接方便的继承它们,自定义对应的子类,稍微了解一下即可,下面给出一个简单的例子:

Python collection模块相关推荐

  1. Python collection模块与深浅拷贝

    collection模块是对Python的通用内置容器:字典.列表.元组和集合的扩展,它包含一些专业的容器数据类型: Counter(计数器):dict子类,用于计算可哈希性对象的个数. Ordere ...

  2. python collection counter_python collection模块中几种数据结构(Counter、OrderedDict、namedtup)详解...

    collection模块中有几种数据结构我们可能用得到. Counter是字典的子类,负责计数的一个字典,支持 + 加法 - 减法 & 求公共元素 | 求并集 print('Counter类型 ...

  3. python 之模块之 xml.dom.minidom解析xml

    # -*- coding: cp936 -*- #python 27 #xiaodeng #python 之模块之 xml.dom.minidom解析xml #http://www.cnblogs.c ...

  4. 开源的python机器学习模块

    为了理解和应用机器学 习技术,你需要学习 Python 或者 R.这两者都是与 C.Java.PHP 相类似的编程语言.但是,因为 Python 与 R 都比较年轻, 而且更加"远离&quo ...

  5. python ca模块_python学习之模块-模块(五)

    5.10 包 5.10.1 包的概念 [官网解释] Packages are a way of structuring Python's module namespace by using " ...

  6. Python Re 模块超全解读!详细

    内行必看!Python Re 模块超全解读! 2019.08.08 18:59:45字数 953阅读 121 re模块下的函数 compile(pattern):创建模式对象 > import ...

  7. python argparse模块_Python argparse模块应用实例解析

    这篇文章主要介绍了Python argparse模块应用实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 简介 argparse是python ...

  8. 关于使用python logging模块的几点总结

    关于使用python logging模块的几点总结 使用python的标准日志模块logging可以非常方便地记录日志.Python日志系统非常丰富.添加结构化或非结构化日志输出到python代码,写 ...

  9. python高级-模块(14)

    一.python中的模块 有过C语言编程经验的朋友都知道在C语言中如果要引用sqrt函数,必须用语句#include <math.h>引入math.h这个头文件,否则是无法正常进行调用的. ...

最新文章

  1. u-boot的linux内核映像加载,基于U_Boot的Linux内核映像加载与引导功能实现.pdf
  2. linux ifconfig找不到
  3. linux打包tar包命令,Linux压缩打包方法连载之一:tar命令
  4. java访问错误404_如何解决 Java web 项目中的 404 错误
  5. 如何从零设计一款牛逼的高并发架构(建议收藏)
  6. xx学OD -- 内存断点(上)
  7. 以Crypto++实现RSA加解密二进制数据
  8. 【翻译】AdaIN:Arbitrary Style Transfer in Real-time with Adaptive Instance Normalization
  9. 软件测试中期答辩,毕业中期答辩模板ppt课件
  10. 计算机高程知识点,测量学复习基本知识点(全).doc
  11. DQN玩Atari游戏安装atari环境bug指南
  12. IMU(LPMS-B2) ROS下使用教程
  13. 用WinSCP登录路由器并传入文件及改文件权限
  14. linux mmc 读写,这个mmc读取linux的原因是什么
  15. 51单片机的指令周期、机器周期、状态周期、时钟周期
  16. bt ct 计算机辅助翻译,计算机辅助翻译报告
  17. JCE问题 :error constructing MAC: java.lang.SecurityException: JCE cannot authenticate the provider BC
  18. 什么是域名被墙?域名被墙了如何解决?
  19. Flowable集成自定义表单001
  20. 【论文写作】闵帆老师论文写作课程心得体会30篇

热门文章

  1. 快用一用 lambda 表达式吧,让你的代码更简洁、更漂亮!
  2. 12.suggest_type
  3. 面试官问我圆角边框,我交出了满分的答卷!——Web前端系列学习笔记
  4. 2.在某应用软件中需要记录业务方法的调用日志,在不修改现有业务类的基础上为每一个类提供一个日志记录代理类,在代理类中输出日志,例如在业务方法 method() 调用之前输出“方法 method() 被
  5. java字符串转语音文件_java - Java文字转语音(Spring Boot) - 堆栈内存溢出
  6. python绘制折线图怎么样填充空白颜色_Python:填补两幅图之间的空白
  7. java j2se1.5_用J2SE1.5建立多任务的Java应用程序...
  8. python中area是什么意思_python – 与openCV 3中的contourArea的兼容性问题
  9. spss process插件_SPSS教程:绘制调节效应图
  10. seo优化源码_武汉seo公司关键词SEO优化实战记录,1个月三个站在首页