collections标准库
collections标准库
之前Python的第三方库用的一直很舒服,现在突然发现标准库也有collections这样的神器,可以补充list、set、dict以外的应用
1. namedtuple
namedtuple
是一个函数,返回一个自定义的tuple,自定义tuple是通过属性而不是索引,使用体验和C的结构体类似
# coding=utf-8
from collections import namedtuple
Point = namedtuple('Point', ('x', 'y', 'color'))
print(Point) # <class '__main__.Point'>
p = Point(1, 2, 'red')
print(p.x, p.y, p.color) # 1 2 red
p2 = p._replace(x=12) # 这里的更新是返回一个新的Point,p本身不变,因为tuple不可变
print(p, p2) # Point(x=1, y=2, color='red') Point(x=12, y=2, color='red')
2. deque
deque
特别适合用于队列和栈操作。虽然list
也可以模拟队列和栈,但是list
是线性存储的单链表数据结构,适合按索引访问,但插入和删除的效率就比较低,而·基于双向链表的deque
特别适合做这些操作
# coding=utf-8
from collections import deque
q = deque(['a', 'b', 'c'])
q.append('x') # 尾部添加
q.appendleft('y') # 头部添加
print(q) # deque(['y', 'a', 'b', 'c', 'x'])
print(q.pop()) # x 尾部弹出
print(q.popleft()) # y 头部弹出
print(q) # deque(['a', 'b', 'c'])
q.insert(1, 'insert') # 插入
q.remove('b') # 删除指定元素
print(q) # deque(['a', 'insert', 'c'])
print(q[1]) # insert 索引
# for循环遍历
for i, e in enumerate(q, start=1):
print(i, ':', e)
# 1 : a
# 2 : insert
# 3 : c
3.defaultdict
普通的dict结构在访问key不存在的对象时会报error,defaultdict可以通过设定默认值解决这个问题,个人感觉在写状态机的时候,初始状态用defaultdict特别方便,有点像C语言的static 变量,只初始一次
# coding=utf-8
from collections import defaultdict
dd = defaultdict(lambda: 10, {}) # 构造函数里的{}可以初始化dd的字典内容
dd['a'] = 10
dd['b'] += 100
print(dd) # defaultdict(<function <lambda> at 0x00000000052C4D08>, {'a': 10, 'b': 110})
# 字符统计的例子
def zero():
return 0
# 生成随机数字串
def generate_digits(length=15):
import string
import random
return random.sample(length * string.digits, length)
chs = generate_digits(5)
stat = defaultdict(zero)
for ch in chs:
stat[ch] += 1
for k, v in stat.items():
print(k, ':', v)
# 2 : 2
# 3 : 1
# 9 : 1
# 5 : 1
4. OrderedDict
普通的dict是无须的,也就是在遍历的时候是无能确定key的顺序的,OrderDict会根据插入顺序排序,可以用在自己封装的对象中,如pytorch中的torch.nn.Sequence
就利用了这个特性
# coding=utf-8
from collections import OrderedDict
od = OrderedDict([
('a', 1),
('b', 2),
('c', 3),
])
od['hello'] = 0
print(od) # OrderedDict([('a', 1), ('b', 2), ('c', 3), ('hello', 0)])
for k, v in od.items():
print(k, ':', v)
# a : 1
# b : 2
# c : 3
# hello : 0
5. ChainMap
ChainMap
可以将多个dict合并,联合查找
# coding=utf-8
from collections import ChainMap
a = {'a': 1, 'b': 2}
b = {'b': 3, 'd': 4} # 注意这里的b重复
cm = ChainMap(a, b)
print(cm) # ChainMap({'a': 1, 'b': 2}, {'b': 3, 'd': 4})
print(cm['b']) # 2 取第一个
print(cm['d']) # 4
cm['b'] = -2 # 这里修改的也是第一个b,由于是传引用,会修改a中的值
print(a, b) # {'a': 1, 'b': -2} {'b': 3, 'd': 4}
6. Counter
就和名称一样,Counter是个简单的计数器
# coding=utf-8
from collections import Counter
c = Counter('helloworld') # 统计可迭代对象的个数,并自动排序
print(c.most_common(2)) # [('l', 3), ('o', 2)]
for k, v in c.items():
print(k, ':', v)
# h : 1
# e : 1
# l : 3
# o : 2
# w : 1
# r : 1
# d : 1
collections标准库的更多相关文章
- Robot framework(RF) Builti,Screenshot和Collections标准库介绍
1.1 Builti标准类库 在学习一门编程语言的时候,大多教材都是从打印“hello world”开始.我们可以像编程语言一样来学习Robot Framework.虽然通过RIDE 提供“填表”一 ...
- python进阶(26)collections标准库
前言 这个模块实现了特定目标的容器,以提供Python标准内建容器dict ,list ,set , 和tuple 的替代选择. 这个模块提供了以下几个函数 函数 作用 namedtuple() 创建 ...
- Python标准库——collections模块的Counter类
1.collections模块 collections模块自Python 2.4版本开始被引入,包含了dict.set.list.tuple以外的一些特殊的容器类型,分别是: OrderedDict类 ...
- Python3标准库:collections容器数据类型
1. collections容器数据类型 collections模块包含除内置类型list.dict和tuple以外的其他容器数据类型. 1.1 ChainMap搜索多个字典 ChainMap类管理一 ...
- 标准库之collections
collections 模块----Python标准库,是数据结构常用模块 常用类型有: 计数器(Counter) dict的子类,计算可hash的对象: 双端队列(deque) 类似于list ...
- python学习笔记系列----(八)python常用的标准库
终于学到了python手册的最后一部分:常用标准库.这部分内容主要就是介绍了一些基础的常用的基础库,可以大概了解下,在以后真正使用的时候也能想起来再拿出来用. 8.1 操作系统接口模块:OS OS模块 ...
- 【循序渐进学Python】11.常用标准库
安装完Python之后,我们也同时获得了强大的Python标准库,通过使用这些标准库可以为我们节省大量的时间.这里是一些常用标准库的简单说明.更多的标准库的说明,可以参考Python文档 sys 模块 ...
- 【python】Python标准库defaultdict模块
来源:http://www.ynpxrz.com/n1031711c2023.aspx Python标准库中collections对集合类型的数据结构进行了很多拓展操作,这些操作在我们使用集合的时候会 ...
- Python标准库映射类型与可散列数据类型的关系
这里有两个概念似懂非懂,在这里明确一下: 映射类型: Python>3.2中,collections.abc模块有Mapping和MutableMapping两个抽象基类(Python2.6~3 ...
随机推荐
- PHP之道 - php各方面的知识汇总
看到一个PHP的知识各方面的汇总,写的很有借鉴意义,搬过来了 转自: https://laravel-china.github.io/php-the-right-way/ 欢迎阅读 其他语言版本 参与 ...
- <六>企业级开源仓库nexus3实战应用–使用nexus3配置yum私有仓库
一两个星期之前,你如果在我跟前说起私服的事情,我大概会绕着你走,因为我对这个东西真的一窍不通.事实上也正如此,开发同学曾不止一次的跟我说公司的私服版本太旧了,许多新的依赖编译之后不会从远程仓库自动缓存 ...
- bootstrap浅谈
学习地址:http://www.runoob.com/bootstrap/bootstrap-tutorial.html 自己练习了下 主要是使用了bootstrap中包含的class类样式,只要给相 ...
- CMDB资产管理系统开发【day25】:Django 自定义用户认证
官方文档:https://docs.djangoproject.com/en/1.10/topics/auth/customizing/#substituting-a-custom-user-mode ...
- kubernetes云平台管理实战: 最小的资源pod(二)
一.pod初体验 1.编辑k8s_pod.yml文件 [root@k8s-master ~]# cat k8s_pod.yml apiVersion: v1 kind: Pod metadata: n ...
- [物理学与PDEs]第1章第3节 真空中的 Maxwell 方程组, Lorentz 力 3.2 Lorentz 力
1. Lorentz 假定, 不论带电体的运动状态如何, 其所受的力密度 (单位体积所受的力) 为 $$\bex {\bf F}=\rho {\bf E}+{\bf j}\times{\bf B} = ...
- Revit手工创建族(转)
http://www.cnblogs.com/greatverve/p/revit-family.html 手工创建族 1.画两个参考平面. 图3001 2.点击族类型,添加参数. 图3002,300 ...
- [51nod1965]奇怪的式子
noteskey 怎么说,魔性的题目...拿来练手 min_25 正好...吧 首先就是把式子拆开来算贡献嘛 \[ANS=\prod_{i=1}^n \sigma_0(i)^{\mu(i)} \pro ...
- java 数组复制
http://www.cnblogs.com/zhengbin/p/5671403.html http://www.cnblogs.com/jjdcxy/p/5870524.html Java数组拷贝 ...
- [Linux]ln -al输出内容解析
第一项的第一位是文件类型:-: 表示普通文件d: 目录b: 块特殊文件c: 字符特殊文件l: 符号链接文件p: 命名管道文件FIFOs: 套接字文件 第二项是该文件的inode的链接计数,即stat ...