每天学点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. JavaScript编程艺术-第7章代码汇总(1)

    1.document.write()(HTML与JS未分离) HTML: JS: 2..innerHTML(直接覆盖) HTML: JS: 3.getAttribute.setAttribute.ge ...

  2. 简单的AndroidStudio单元测试工程配置

    转载: http://www.jianshu.com/p/03118c11c199

  3. 169 Majority Element 求众数 数组中出现次数超过一半的数字

    给定一个大小为 n 的数组,找到其中的众数.众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素.你可以假设数组是非空的,并且数组中的众数永远存在. 详见:https://leetcode.com/p ...

  4. 基于Ubuntu14.04下Suricata(一款高性能的网络IDS、IPS和网络安全监控引擎)的搭建(图文详解)(博主推荐)

    为什么,要写这篇论文? 是因为,目前科研的我,正值研三,致力于网络安全.大数据.机器学习研究领域! 论文方向的需要,同时不局限于真实物理环境机器实验室的攻防环境.也不局限于真实物理机器环境实验室的大数 ...

  5. css靠左,靠右

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. windows系统同时安装多个nodejs环境(一键切换)

    由于不同程序对nodejs的环境要求不同,从而导致在单台电脑上开发多个nodejs应用很烦人: 好在gnvm,这个家伙帮我解决了问题 官网: https://github.com/kenshin/gn ...

  7. 锁 Lock、重入锁、写入锁

    ReentrantLock 重入锁 类似于synchronize 区别与写法上,在需要进行同步的代码部分加上锁定,但不要忘记最后一定要释放锁定, 不然会造成锁永远无法释放,其他线程永远进不来的结果.e ...

  8. hihocoder1703 第K小先序遍历

    思路: 给定n个节点二叉树的中序遍历,不同形态的二叉树的种类数有卡特兰数个.为了在中序序列[l, r]表示的子树上找先序序列第k小的树,首先需要从小到大枚举每个节点作根所能构成的二叉树的数目来确定树根 ...

  9. vue热重载

    依据官网使用 webpack 的 Hot Module Replacement API,Vuex 支持在开发过程中热重载 mutation.module.action 和 getter.你也可以在 B ...

  10. [Windows Server 2008] 阿里云.云主机忘记密码解决方法

    ★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com ★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频. ★ 本节我们将带领大家:解决阿里云 ...