collections标准库

之前Python的第三方库用的一直很舒服,现在突然发现标准库也有collections这样的神器,可以补充list、set、dict以外的应用

1. namedtuple

namedtuple是一个函数,返回一个自定义的tuple,自定义tuple是通过属性而不是索引,使用体验和C的结构体类似

  1. # coding=utf-8
  2. from collections import namedtuple
  3. Point = namedtuple('Point', ('x', 'y', 'color'))
  4. print(Point) # <class '__main__.Point'>
  5. p = Point(1, 2, 'red')
  6. print(p.x, p.y, p.color) # 1 2 red
  7. p2 = p._replace(x=12) # 这里的更新是返回一个新的Point,p本身不变,因为tuple不可变
  8. print(p, p2) # Point(x=1, y=2, color='red') Point(x=12, y=2, color='red')

2. deque

deque特别适合用于队列和栈操作。虽然list也可以模拟队列和栈,但是list是线性存储的单链表数据结构,适合按索引访问,但插入和删除的效率就比较低,而·基于双向链表的deque特别适合做这些操作

  1. # coding=utf-8
  2. from collections import deque
  3. q = deque(['a', 'b', 'c'])
  4. q.append('x') # 尾部添加
  5. q.appendleft('y') # 头部添加
  6. print(q) # deque(['y', 'a', 'b', 'c', 'x'])
  7. print(q.pop()) # x 尾部弹出
  8. print(q.popleft()) # y 头部弹出
  9. print(q) # deque(['a', 'b', 'c'])
  10. q.insert(1, 'insert') # 插入
  11. q.remove('b') # 删除指定元素
  12. print(q) # deque(['a', 'insert', 'c'])
  13. print(q[1]) # insert 索引
  14. # for循环遍历
  15. for i, e in enumerate(q, start=1):
  16. print(i, ':', e)
  17. # 1 : a
  18. # 2 : insert
  19. # 3 : c

3.defaultdict

普通的dict结构在访问key不存在的对象时会报error,defaultdict可以通过设定默认值解决这个问题,个人感觉在写状态机的时候,初始状态用defaultdict特别方便,有点像C语言的static 变量,只初始一次

  1. # coding=utf-8
  2. from collections import defaultdict
  3. dd = defaultdict(lambda: 10, {}) # 构造函数里的{}可以初始化dd的字典内容
  4. dd['a'] = 10
  5. dd['b'] += 100
  6. print(dd) # defaultdict(<function <lambda> at 0x00000000052C4D08>, {'a': 10, 'b': 110})
  7. # 字符统计的例子
  8. def zero():
  9. return 0
  10. # 生成随机数字串
  11. def generate_digits(length=15):
  12. import string
  13. import random
  14. return random.sample(length * string.digits, length)
  15. chs = generate_digits(5)
  16. stat = defaultdict(zero)
  17. for ch in chs:
  18. stat[ch] += 1
  19. for k, v in stat.items():
  20. print(k, ':', v)
  21. # 2 : 2
  22. # 3 : 1
  23. # 9 : 1
  24. # 5 : 1

4. OrderedDict

普通的dict是无须的,也就是在遍历的时候是无能确定key的顺序的,OrderDict会根据插入顺序排序,可以用在自己封装的对象中,如pytorch中的torch.nn.Sequence就利用了这个特性

  1. # coding=utf-8
  2. from collections import OrderedDict
  3. od = OrderedDict([
  4. ('a', 1),
  5. ('b', 2),
  6. ('c', 3),
  7. ])
  8. od['hello'] = 0
  9. print(od) # OrderedDict([('a', 1), ('b', 2), ('c', 3), ('hello', 0)])
  10. for k, v in od.items():
  11. print(k, ':', v)
  12. # a : 1
  13. # b : 2
  14. # c : 3
  15. # hello : 0

5. ChainMap

ChainMap可以将多个dict合并,联合查找

  1. # coding=utf-8
  2. from collections import ChainMap
  3. a = {'a': 1, 'b': 2}
  4. b = {'b': 3, 'd': 4} # 注意这里的b重复
  5. cm = ChainMap(a, b)
  6. print(cm) # ChainMap({'a': 1, 'b': 2}, {'b': 3, 'd': 4})
  7. print(cm['b']) # 2 取第一个
  8. print(cm['d']) # 4
  9. cm['b'] = -2 # 这里修改的也是第一个b,由于是传引用,会修改a中的值
  10. print(a, b) # {'a': 1, 'b': -2} {'b': 3, 'd': 4}

6. Counter

就和名称一样,Counter是个简单的计数器

  1. # coding=utf-8
  2. from collections import Counter
  3. c = Counter('helloworld') # 统计可迭代对象的个数,并自动排序
  4. print(c.most_common(2)) # [('l', 3), ('o', 2)]
  5. for k, v in c.items():
  6. print(k, ':', v)
  7. # h : 1
  8. # e : 1
  9. # l : 3
  10. # o : 2
  11. # w : 1
  12. # r : 1
  13. # d : 1

collections标准库的更多相关文章

  1. Robot framework(RF) Builti,Screenshot和Collections标准库介绍

    1.1  Builti标准类库 在学习一门编程语言的时候,大多教材都是从打印“hello world”开始.我们可以像编程语言一样来学习Robot Framework.虽然通过RIDE 提供“填表”一 ...

  2. python进阶(26)collections标准库

    前言 这个模块实现了特定目标的容器,以提供Python标准内建容器dict ,list ,set , 和tuple 的替代选择. 这个模块提供了以下几个函数 函数 作用 namedtuple() 创建 ...

  3. Python标准库——collections模块的Counter类

    1.collections模块 collections模块自Python 2.4版本开始被引入,包含了dict.set.list.tuple以外的一些特殊的容器类型,分别是: OrderedDict类 ...

  4. Python3标准库:collections容器数据类型

    1. collections容器数据类型 collections模块包含除内置类型list.dict和tuple以外的其他容器数据类型. 1.1 ChainMap搜索多个字典 ChainMap类管理一 ...

  5. 标准库之collections

    collections 模块----Python标准库,是数据结构常用模块 常用类型有: 计数器(Counter)   dict的子类,计算可hash的对象: 双端队列(deque)  类似于list ...

  6. python学习笔记系列----(八)python常用的标准库

    终于学到了python手册的最后一部分:常用标准库.这部分内容主要就是介绍了一些基础的常用的基础库,可以大概了解下,在以后真正使用的时候也能想起来再拿出来用. 8.1 操作系统接口模块:OS OS模块 ...

  7. 【循序渐进学Python】11.常用标准库

    安装完Python之后,我们也同时获得了强大的Python标准库,通过使用这些标准库可以为我们节省大量的时间.这里是一些常用标准库的简单说明.更多的标准库的说明,可以参考Python文档 sys 模块 ...

  8. 【python】Python标准库defaultdict模块

    来源:http://www.ynpxrz.com/n1031711c2023.aspx Python标准库中collections对集合类型的数据结构进行了很多拓展操作,这些操作在我们使用集合的时候会 ...

  9. Python标准库映射类型与可散列数据类型的关系

    这里有两个概念似懂非懂,在这里明确一下: 映射类型: Python>3.2中,collections.abc模块有Mapping和MutableMapping两个抽象基类(Python2.6~3 ...

随机推荐

  1. linux中使用gdb调试程序

     ref:https://blog.csdn.net/tenfyguo/article/details/8159176 一,什么是coredump 我们经常听到大家说到程序core掉了,需要定位解决, ...

  2. 面向对象之组合、封装、多态、property装饰器

    概要: 组合 封装 property装饰器 多态 Python推崇鸭子类型:解耦合,统一标准(不用继承) 1. 组合 继承:会传递给子类强制属性 组合:解耦合,减少占用内存.如:正常继承,如果一个班级 ...

  3. 第三节:总结.Net下后端的几种请求方式(WebClient、WebRequest、HttpClient)

    一. 前言 前端调用有Form表单提交,ajax提交,ajax一般是用Jquery的简化写法,在这里不再过多介绍: 后端调用大约有这些:WebCient.WebRequest.Httpclient.W ...

  4. [物理学与PDEs]第1章第6节 电磁场的标势与矢势 6.3 例 --- 电偶极辐射

    1. 偶极子: 相距为 $l$, 带电量分别为 $\pm q$ 的一对电荷组成的系统. 称 $$\bex {\bf m}=q{\bf l} \eex$$ 为电偶极矩, 其中 ${\bf l}$ 为 $ ...

  5. artDialog记录

    //在子页面加按钮的方式 var api = frameElement.api, W = api.opener; api.button({ id: 'valueOk', name: '确定', cal ...

  6. LCA学习笔记

    写在前面 目录 一.LCA的定义 二.暴力法求LCA 三.倍增法求LCA 四.树链剖分求LCA 五.LCA典型例题 题目完成度 一.LCA的定义 LCA指的是最近公共祖先.具体地,给定一棵有根树,若结 ...

  7. C#任务同步

    using System; using System.Diagnostics; using System.Threading; using System.Threading.Tasks; using ...

  8. C#处理非托管资源

    using System; //处理非托管资源 //例如:文件句柄.网络连接.数据库连接 //实现IDisposable不意味着也应该实现一个终结器,终结器会带来额外开销 //发布本机资源,要释放本机 ...

  9. Oracle 表操作

    表操作 复制表结构和数据 CREATE TABLE table_name AS SELECT * FROM old_table_name; 复制表结构 CREATE TABLE table_name ...

  10. python学习第24天

    内置方法 常用 __new__ __del__ __call__ 不常用 __str__ __repr__ __enter__ __exit__