每天学点Python之collections

内容摘抄自:<python大法好>的每天学点Python之collections

collections模块在内置数据类型(dictlistsettuple)的基础上,提供了几个额外的数据类型:ChainMapCounterdequedefaultdictnamedtupleOrderedDict等。

ChainMap

ChainMap是python3的新特性,它用来将多个map组成一个新的单元(原来的map结构仍然存在,类似于这些map被存在了一个list之中),这比新建一个map再将其他map用update加进来快得多。通过ChainMap可以来模拟嵌套的情景,而且多用于模板之中。

ChainMap支持普通map的所有操作,下面主要展示一下它的特性:

# 新建ChainMap及它的结构
In[2]: from collections import ChainMap
In[3]: m1 = {'color': 'red', 'user': 'guest'}
In[4]: m2 = {'name': 'drfish', 'age': ''}
In[5]: chainMap = ChainMap(m1, m2)
In[6]: print(chainMap.items())
ItemsView(ChainMap({'user': 'guest', 'color': 'red'}, {'age': '', 'name': 'drfish'})) # 获取ChainMap中的元素
In[7]: print(chainMap.get('name'))
drfish
In[8]: print(chainMap.get('not'))
None # 新增map
In[9]: m3 = {'data': '1-6'}
In[10]: chainMap = chainMap.new_child(m3)
In[11]: print(chainMap.items())
ItemsView(ChainMap({'data': '1-6'}, {'user': 'guest', 'color': 'red'}, {'age': '', 'name': 'drfish'})) # 新增map也可以直接ChainMap,但是格式就会变成
 ChainMap(ChainMap({'color': 'red', 'user': 'wjh'}, {'name': 'zy', 'age': 18}), {'new': 'hello'}) # parents属性
In[12]: print(chainMap.parents)
ChainMap({'user': 'guest', 'color': 'red'}, {'age': '', 'name': 'drfish'})
In[13]: print(chainMap.parents.parents)
ChainMap({'age': '', 'name': 'drfish'})
In[14]: print(chainMap.parents.parents.parents)
ChainMap({}) # maps属性
In[15]: chainMap.maps
Out[15]:
[{'data': '1-6'},
{'color': 'red', 'user': 'guest'},
{'age': '', 'name': 'drfish'}]
  • 可以传入多个map来初始化ChainMap,如参数为空,会自动加入一个空的map
  • 获取的key如果不存在,则返回None
  • 可以通过new_child()方法来新增map,新的map 添加在前面
  • parents属性返回除去第一个map后的ChainMap实例。

Counter

Counter是一个简单的计数器,使用起来非常方便。

初始化

Counter的初始化支持多种形式

In[18]: from collections import Counter
In[19]: c = Counter()
In[20]: c = Counter('hello')
In[21]: c = Counter({'a':3,'b':19})
In[22]: c = Counter(cats=2,dogs=1)
In[23]: c
Out[23]: Counter({'cats': 2, 'dogs': 1})

Counter对于不存在的元素会返回0,如果要删除则需要用到del:

In[23]: c
Out[23]: Counter({'cats': 2, 'dogs': 1})
In[24]: c['birds']
Out[24]: 0
In[25]: del c['cats']
In[26]: c
Out[26]: Counter({'dogs': 1})

elements()方法会返回所有的元素,有几个就返回几个;而most_common(n)方法可以返回数量排前n的元素及其数目:

In[29]: c = Counter(a=4, b=2, c=0, d=-2)
In[30]: list(c.elements())
Out[30]: ['a', 'a', 'a', 'a', 'b', 'b']
In[33]: c.most_common(1)
Out[33]: [('a', 3)]

不同的Counter之间还可以进行运算操作,subtract()方法进行减法后会影响调用方;&操作表示取两个中数目小的一个(如果只在一个Counter中存在,则结果集中也没有),|操作取数目大的。

In[46]: c = Counter(a=13, b=11)
In[47]: d = Counter(a=1, b=2)
In[48]: c.subtract(d)
In[49]: c
Out[49]: Counter({'a': 12, 'b': 9}) In[51]: c+d
Out[51]: Counter({'a': 13, 'b': 11})
In[52]: c-d
Out[52]: Counter({'a': 11, 'b': 7})
In[54]: c&d
Out[54]: Counter({'a': 1, 'b': 2})
In[55]: c|d
Out[55]: Counter({'a': 12, 'b': 9})

注:进行运算操作时,如果数目结果为负的会被直接忽略

deque

deque就是一个双端队列,与list非常相似,不过可以同时在list的左边增删元素:

In[72]: dq = deque('abd')
In[73]: dq
Out[73]: deque(['a', 'b', 'd'])
In[74]: dq.append('')
In[75]: dq.appendleft('-1')
In[76]: dq
Out[76]: deque(['-1', 'a', 'b', 'd', ''])
In[77]: dq.popleft()
Out[77]: '-1'
In[78]: dq.extendleft("hello")
In[79]: dq
Out[79]: deque(['o', 'l', 'l', 'e', 'h', 'a', 'b', 'd', ''])

注意extendleft(x)方法相当于先把x翻转后在添加到列表前端。然后比较好用的是rotate方法,可以使队列中的元素顺序前移或者后移:

In[82]: dq=deque("")
In[83]: dq
Out[83]: deque(['', '', '', '', ''])
In[84]: dq.rotate(2)
In[85]: dq
Out[85]: deque(['', '', '', '', ''])
In[86]: dq.rotate(-4)
In[87]: dq
Out[87]: deque(['', '', '', '', ''])

defaultdict

defaultdict在普通的dict之上添加了默认工厂,使得键不存在时会自动生成相应类型的值:

In[88]: from collections import defaultdict
In[89]: d = defaultdict(int)
In[90]: d['a']
Out[90]: 0
In[91]: d = defaultdict(dict)
In[92]: d['a']
Out[92]: {}

如果初始化时没有加入默认工厂,则同样会抛出KeyError错误:

In[93]: d = defaultdict()
In[94]: d['a']
Traceback (most recent call last):
d['a']
KeyError: 'a'

namedtuple

namedtuple是tuple的加强版本,最大的作用就是给tuple的每个位置的值设置了别名,增加了程序的可读性:

In[95]: from collections import namedtuple
In[96]: Point = namedtuple("Point",['x','y'])
In[97]: p = Point(1,2)
In[98]: p.x
Out[98]: 1
In[99]: p.y
Out[99]: 2

由于有了别名,相当于形成了一个字典,namedtuple可以转化为下面要介绍的OrderedDict,同时也可以通过字典转化而来:

In[100]: p._asdict()
Out[100]: OrderedDict([('x', 1), ('y', 2)])
In[101]: d = {'x':11,'y':22}
In[102]: Point(**d)
Out[102]: Point(x=11, y=22)

namedtuple也提供了获取所有域及修改相应值的方法:

In[108]: p
Out[108]: Point(x=1, y=2)
In[109]: p._fields
Out[109]: ('x', 'y')
In[110]: p._replace(x=10)
Out[110]: Point(x=10, y=2)

OrderedDict

dict是无序,但有时我们希望字典是有序的,OrderedDict提供了这项服务,OrderedDict中的键值对是按照他们加入时的顺序存储的:

In[130]: fruit=(('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1))

In[131]: d = dict(fruit)
In[132]: d
Out[132]: {'apple': 4, 'banana': 3, 'orange': 2, 'pear': 1}
In[135]: d.popitem()
Out[135]: ('apple', 4)
In[136]: d.popitem()
Out[136]: ('orange', 2)
In[137]: d.popitem()
Out[137]: ('banana', 3)
In[138]: d.popitem()
Out[138]: ('pear', 1) In[133]: od = OrderedDict(fruit)
In[134]: od
Out[134]: OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)])
In[139]: od.popitem()
Out[139]: ('pear', 1)
In[140]: od.popitem()
Out[140]: ('orange', 2)
In[141]: od.popitem()
Out[141]: ('banana', 3)
In[142]: od.popitem()
Out[142]: ('apple', 4)

注:OrderedDict中popitem(last=True)函数如果last设置为False,则先加入的先弹出

可以通过move_to_end(key, last=True)函数来改变键值对的位置,True时移到末尾,False移到开头:

In[146]: od
Out[146]: OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)])
In[147]: od.move_to_end('apple')
In[148]: od
Out[148]: OrderedDict([('banana', 3), ('orange', 2), ('pear', 1), ('apple', 4)])
In[149]: od.move_to_end('pear',False)
In[150]: od
Out[150]: OrderedDict([('pear', 1), ('banana', 3), ('orange', 2), ('apple', 4)])

每天学点Python之collections的更多相关文章

  1. Python中collections模块

    目录 Python中collections模块 Counter defaultdict OrderedDict namedtuple deque ChainMap Python中collections ...

  2. 学了 Python 能用来做这些!

    来源商业新知网,原标题:学了 Python 能用来做什么? 说起编程语言,Python 也许不是使用最广的,但一定是现在被谈论最多的.随着近年大数据.人工智能的兴起,Python 越来越多的出现在人们 ...

  3. 人工智能时代,是时候学点Python了!

    “是时候学点Python了”.作为一名不怎么安分的程序员,你或许觉得,产生这样的想法并不奇怪,但学习Python却是出于自己对工作现状以及如何应对未来挑战所作出的思考.读过我以前博客的朋友,可能都知道 ...

  4. 学了Python可以做什么工作

    学了Python可以做什么工作 用 Python 写爬虫 据我所知很多初学 Python 的人都是使用它编写爬虫程序.小到抓取一个小黄图网站,大到一个互联网公司的商业应用.通过 Python 入门爬虫 ...

  5. Python的collections模块中namedtuple结构使用示例

      namedtuple顾名思义,就是名字+元组的数据结构,下面就来看一下Python的collections模块中namedtuple结构使用示例 namedtuple 就是命名的 tuple,比较 ...

  6. 每天学点Python之bytes

    每天学点Python之bytes Python中的字节码用b'xxx'的形式表示.x能够用字符表示,也能够用ASCII编码形式\xnn表示.nn从00-ff(十六进制)共256种字符. 基本操作 以下 ...

  7. 你必须学写 Python 装饰器的五个理由

    你必须学写Python装饰器的五个理由 ----装饰器能对你所写的代码产生极大的正面作用 作者:Aaron Maxwell,2016年5月5日 Python装饰器是很容易使用的.任何一个会写Pytho ...

  8. 每天学点Python之comprehensions

    每天学点Python之comprehensions 推导式能够简化对数据的处理,让代码简洁的同一时候还具有非常高的可读性.这在Python中非经常见. 列表推导式 通过列表推导式能够对列表中的全部元素 ...

  9. python内置模块collections介绍

    目录 python内置模块collections介绍 1.namedtuple 2.deque 3.defaultdict 4.OrderedDict 5.ChainMap 6.Counter 7.小 ...

随机推荐

  1. SpringMVC传递multiple类型select后台Controller的接收方法

    Spring MVC在接收集合请求参数时,需要在Controller方法的集合参数里前添加@RequestBody,而@RequestBody默认接收的enctype (MIME编码)是applica ...

  2. Boost1.6x+win7+VC2015编译

    下载 通过boost官方网站, 或直接在source forge下载boost_1_6x_0. 可选包 Zlib library, 环境变量: ZLIB_SOURCE bzip2, 环境变量: BZI ...

  3. hdu 1863 畅通工程(Kruskal+并查集)

    畅通工程 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  4. 173 Binary Search Tree Iterator 二叉搜索树迭代器

    实现一个二叉搜索树迭代器.你将使用二叉搜索树的根节点初始化迭代器.调用 next() 将返回二叉搜索树中的下一个最小的数.注意: next() 和hasNext() 操作的时间复杂度是O(1),并使用 ...

  5. .NET 原理之 ViewState

    1.从MSDN中我们可以知道一个页面生命周期大约可分为为:页请求.开始.初始化.加载.验证.回发事件处理.呈现.卸载这几个阶段.       HttpHandler是无状态的,aspx是高级的Http ...

  6. Node.js——网站访问一般流程

  7. OpenGL Column-Major Matrix 使用注意事项

    这column major的矩阵是彻底把我搞晕了,以后右乘规则下的矩阵应该这么用 假设我想创建一个2x2的矩阵,数学上我这么写: 1 2 3 4 用代码创建的话这么写 // 按照 row major ...

  8. CentOS 7 配置本地yum 源

    1. 加载 CentOS的ISO镜像并挂载: [root@localhost files]# mount /media/files/CentOS-7-x86_64-DVD-1611.iso /mnt/ ...

  9. 开源一个一个NodeJS 代理服务器扫描工具,可以用来***

    鉴于我朝很多网站访问不了,google等就是大悲剧,之前一直在用VPN,但是公司内网VPN被封,诸多工具也惨遭毒手..我辈怎能容忍. 目前只有代理没有被封,于是搞了个代理扫描工具并开源: https: ...

  10. Shiro的subject实质上是当前执行用户的特定视图。

    Shiro的subject实质上是当前执行用户的特定视图. 通过org.apache.shiro.SecurityUtils可以查询当前执行用户: Subject currentUser = Secu ...