Python collection模块
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)
,当m
为None
时,等价于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
Counter
和dict
不同之处在于如果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对象作为参数进行初始化,得到一个双端队列。双端队列支持从任一侧线程安全,内存高效的append
和pop
操作,并且复杂度为时间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,如果没找到抛出ValueError
c错误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] = []。现在再回到defaultdict
,defaultdict([default_factory[, ...]])
,构造方法中default_factory
默认是None
,defaultdict
是dict
的一个subclass,它重写了一个__miss__
方法以及拥有一个default_factory
属性。
__miss__(key)
该方法在当key不存在时才会且仅被
__getitem__()
调用,所以当使用dict.get()
方法获取一个不存在的键值时,返回结果为None
,而不是使用default_factory
;当
default_factory
为None
时,索引一个不存在的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
也具有这个特性。但是,dict
和OrderedDict
依旧有些区别:
- 对于常规
dict
,最重要的高效的mapping operations,而Track 插入顺序是次要的; - 对于
OrderedDict
,最重要的是排序操作,而空间效率、迭代效率以及更新字典的性能是次要的; OrderedDict
可以处理频繁的需要重排的操作,适合于Track最近的操作;- 判断两个
OrderedDict
是否相等同时要求顺序也相同; OrderedDict
的popitem(last=True)
中可以通过last参数控制pop哪一端的元素;OrderedDict
的move_to_end(key, last=True)
可以高效的将元素移至末尾;- 直到Python3.8,
dict
没有__reversed__()
方法;
UserDict
& UserList
& UserString
UserDict
& UserList
& UserString
分别是dict
、list
、str
的一个wrapper,在实际应用中,已经很少使用到它们了,因为我们可以直接方便的继承它们,自定义对应的子类,稍微了解一下即可,下面给出一个简单的例子:
Python collection模块相关推荐
- Python collection模块与深浅拷贝
collection模块是对Python的通用内置容器:字典.列表.元组和集合的扩展,它包含一些专业的容器数据类型: Counter(计数器):dict子类,用于计算可哈希性对象的个数. Ordere ...
- python collection counter_python collection模块中几种数据结构(Counter、OrderedDict、namedtup)详解...
collection模块中有几种数据结构我们可能用得到. Counter是字典的子类,负责计数的一个字典,支持 + 加法 - 减法 & 求公共元素 | 求并集 print('Counter类型 ...
- python 之模块之 xml.dom.minidom解析xml
# -*- coding: cp936 -*- #python 27 #xiaodeng #python 之模块之 xml.dom.minidom解析xml #http://www.cnblogs.c ...
- 开源的python机器学习模块
为了理解和应用机器学 习技术,你需要学习 Python 或者 R.这两者都是与 C.Java.PHP 相类似的编程语言.但是,因为 Python 与 R 都比较年轻, 而且更加"远离&quo ...
- python ca模块_python学习之模块-模块(五)
5.10 包 5.10.1 包的概念 [官网解释] Packages are a way of structuring Python's module namespace by using " ...
- Python Re 模块超全解读!详细
内行必看!Python Re 模块超全解读! 2019.08.08 18:59:45字数 953阅读 121 re模块下的函数 compile(pattern):创建模式对象 > import ...
- python argparse模块_Python argparse模块应用实例解析
这篇文章主要介绍了Python argparse模块应用实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 简介 argparse是python ...
- 关于使用python logging模块的几点总结
关于使用python logging模块的几点总结 使用python的标准日志模块logging可以非常方便地记录日志.Python日志系统非常丰富.添加结构化或非结构化日志输出到python代码,写 ...
- python高级-模块(14)
一.python中的模块 有过C语言编程经验的朋友都知道在C语言中如果要引用sqrt函数,必须用语句#include <math.h>引入math.h这个头文件,否则是无法正常进行调用的. ...
最新文章
- u-boot的linux内核映像加载,基于U_Boot的Linux内核映像加载与引导功能实现.pdf
- linux ifconfig找不到
- linux打包tar包命令,Linux压缩打包方法连载之一:tar命令
- java访问错误404_如何解决 Java web 项目中的 404 错误
- 如何从零设计一款牛逼的高并发架构(建议收藏)
- xx学OD -- 内存断点(上)
- 以Crypto++实现RSA加解密二进制数据
- 【翻译】AdaIN:Arbitrary Style Transfer in Real-time with Adaptive Instance Normalization
- 软件测试中期答辩,毕业中期答辩模板ppt课件
- 计算机高程知识点,测量学复习基本知识点(全).doc
- DQN玩Atari游戏安装atari环境bug指南
- IMU(LPMS-B2) ROS下使用教程
- 用WinSCP登录路由器并传入文件及改文件权限
- linux mmc 读写,这个mmc读取linux的原因是什么
- 51单片机的指令周期、机器周期、状态周期、时钟周期
- bt ct 计算机辅助翻译,计算机辅助翻译报告
- JCE问题 :error constructing MAC: java.lang.SecurityException: JCE cannot authenticate the provider BC
- 什么是域名被墙?域名被墙了如何解决?
- Flowable集成自定义表单001
- 【论文写作】闵帆老师论文写作课程心得体会30篇
热门文章
- 快用一用 lambda 表达式吧,让你的代码更简洁、更漂亮!
- 12.suggest_type
- 面试官问我圆角边框,我交出了满分的答卷!——Web前端系列学习笔记
- 2.在某应用软件中需要记录业务方法的调用日志,在不修改现有业务类的基础上为每一个类提供一个日志记录代理类,在代理类中输出日志,例如在业务方法 method() 调用之前输出“方法 method() 被
- java字符串转语音文件_java - Java文字转语音(Spring Boot) - 堆栈内存溢出
- python绘制折线图怎么样填充空白颜色_Python:填补两幅图之间的空白
- java j2se1.5_用J2SE1.5建立多任务的Java应用程序...
- python中area是什么意思_python – 与openCV 3中的contourArea的兼容性问题
- spss process插件_SPSS教程:绘制调节效应图
- seo优化源码_武汉seo公司关键词SEO优化实战记录,1个月三个站在首页