容器(collections)是Python附带一个模块,它包含许多容器数据类型,今天先拿出defaultdict来说。

dict在python中是非常常见的一种数据类型。

colours = (('Yasoob', 'Yellow'),('Ali', 'Blue'),('Arham', 'Green'),
)
dict = {}
for name, colour in colours:dict[name] = colour
print(dict)
#output: {'Yasoob': 'Yellow', 'Ali': 'Blue', 'Arham': 'Green'}

以上是dict的最常见用法,构造 键-值,但是它的缺陷是碰到没有遇到的键,就会报错

print(dict['bob'])
#output:KeyError: 'bob'


这时候defaultdict就能派上用场了。

classcollections.defaultdict([default_factory[,...]])

defaultdict 是内置 dict 类的子类。它重载了一个方法并添加了一个可写的实例变量。其余的功能与 dict 类相同。

本对象包含一个名为 default_factory 的属性,构造时,第一个参数用于为该属性提供初始值,默认为 None。所有其他参数(包括关键字参数)都相当于传递给 dict 的构造函数。

根据定义,defaultdic只是比dict多了一个方法,而这个方法就是__missing__, 这个方法与default_factory有关。

如果 default_factory 属性为 None,则调用本方法会抛出 KeyError 异常,附带参数 key。如果 default_factory 不为 None,则它会被(不带参数地)调用来为 key 提供一个默认值,这个值和 key 作为一对键值对被插入到字典中,并作为本方法的返回值返回。

default_factory

本属性由__missing__()方法来调用。如果构造对象时提供了第一个参数,则本属性会被初始化成那个参数,如果未提供第一个参数,则本属性为None

default_factory可以为很多类型,list、set、str都可以,如果key不存在,返回为默认值。

dict1 = defaultdict(int)
dict2 = defaultdict(set)
dict3 = defaultdict(str)
dict4 = defaultdict(list)print(dict1[1])
print(dict2[1])
print(dict3[1])
print(dict4[1])output:
0      int的默认值
set()  set的默认值str的默认值
[]     list的默认值

List

使用 list 作为 default_factory,很轻松地将(键-值对组成的)序列转换为(键-列表组成的)字典:

s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
d = defaultdict(list)
for k, v in s:d[k].append(v)
print(d)output:
defaultdict(<class 'list'>, {'yellow': [1, 3], 'blue': [2, 4], 'red': [1]})

Int

设置 default_factory 为 int,使 defaultdict 用于计数(类似其他语言中的 bag 或 multiset):

str = 'chinese'
d = defaultdict(int)
for k in str:d[k] += 1
print(d)output:
defaultdict(<class 'int'>, {'c': 1, 'h': 1, 'i': 1, 'n': 1, 'e': 2, 's': 1})

当一个字母首次遇到时,它会查询失败,则 default_factory 会调用 int() 来提供一个整数 0 作为默认值。后续的自增操作建立起对每个字母的计数。

Set

设置 default_factory 为 set 使 defaultdict 用于构建 set 集合:

s = [('red', 1), ('blue', 2), ('red', 3), ('blue', 4), ('red', 1), ('blue', 4)]
d = defaultdict(set)
for k, v in s:d[k].add(v)
print(d)output:
defaultdict(<class 'set'>, {'red': {1, 3}, 'blue': {2, 4}})

Lambda

Lambda函数更为灵活的指定默认值,可以为任意值。

strings = 'chinese'
counts = defaultdict(lambda: 0)
for i in strings:counts[i] +=1
print(counts)output:
defaultdict(<function <lambda> at 0x7fe1b1b3d170>, {'c': 1, 'h': 1, 'i': 1, 'n': 1, 'e': 2, 's': 1})#和int一样的效果

test = defaultdict(lambda : 'hello')
test[1]
test[2] = 'two'
print(test)output:
defaultdict(<function <lambda> at 0x7fe338b11170>, {1: 'hello', 2: 'two'})

Tips:

之前的输出都是连带着defaultdict里default_factory都输出了,但是一般没有必要,只需要使用item。

s = [('red', 1), ('blue', 2), ('red', 3), ('blue', 4), ('red', 1), ('blue', 4)]
d = defaultdict(set)
for k, v in s:d[k].add(v)
print(d)
print(d.items())output:
defaultdict(<class 'set'>, {'red': {1, 3}, 'blue': {2, 4}})
dict_items([('red', {1, 3}), ('blue', {2, 4})])


平凡:Python collections 之 Counter​zhuanlan.zhihu.com

平凡:Python Collections 之 deque​zhuanlan.zhihu.com

构造函数= default;_Python Collections之defaultdict 和 default_factory关系相关推荐

  1. python defaultdict 类属性_Python collections.defaultdict模块用法详解

    Python中通过Key访问字典,当Key不存在时,会引发'KeyError'异常.为了避免这种情况的发生,可以使用collections类中的defaultdict()方法来为字典提供默认值. 语法 ...

  2. python容器数据类型_python collections 容器数据类型

    这个模块实现了特定目标的容器,以提供Python标准内建容器 dict , list , set , 和 tuple 的替代选择. 创建命名元组子类的工厂函数 类似列表(list)的容器,实现了在两端 ...

  3. collections之defaultdict

    最近在学习collections库,做一点笔记. 1.基础介绍 统计一个列表中元素出现的次数 #encoding:utf-8from collections import defaultdictuse ...

  4. python length从哪个包引入_python collections包

    defaultdict Counter deque namedtuple OrderedDict defaultdict 在python原生的数据结构中如果用d[key]访问,当指定key不存在时,会 ...

  5. python类与类的关系_python 类与类之间的关系

    一.依赖关系(紧密程度最低) (1)简单的定义:就是方法中传递一个对象.此时类与类之间存在依赖关系,此关系比较低. (2)实例植物大战僵尸简易版 题目要求:创建一个植物,创建一个僵尸 1.植物:名字. ...

  6. 浅谈javascript中原型(prototype)、构造函数、对象实例及三者之间的关系

    转自:http://www.cnblogs.com/zhangwei412827/archive/2012/12/14/2816263.html 浅谈javascript中原型(prototype). ...

  7. JavaScript 进阶 35 -- 构造函数、原型对象、实例之间的关系详解

    说到继承 ,先要弄明白 :构造函数.原型对象.实例之间的关系. 先来了解几个简单的概念: 构造函数:通过 关键字 new 来调用的 函数,var p = new Person():Person就称为构 ...

  8. JS高级进阶总结day01---面向对象编程介绍,new的工作原理以及构造函数,原型对象,实力函数三者之间的关系

    02-面向对象编程 1.1-面向对象编程介绍 本小节知识点 1.理解什么是面向对象编程 面向对象不是一门技术,而是一种解决问题的思维方式 面向对象的本质是对面向过程的一种封装 2.理解什么是对象 对象 ...

  9. python defaultdict(list)_Python collections.defaultdict() 与 dict的使用和区别

    在Python里面有一个模块collections,解释是数据类型容器模块.这里面有一个collections.defaultdict()经常被用到.主要说说这个东西. 综述: 这里的defaultd ...

最新文章

  1. 飞机大战html游戏全代码js、jquery操作
  2. linux释放内存命令
  3. all any 或 此运算符后面必须跟_PHP程序员必须会的 45 个PHP 面试题(第一部分)...
  4. Kafka无消息丢失配置
  5. python3高性能网络编程_Python3 网络编程
  6. HTML行内元素/行级元素/内联元素/行标签/内联标签/行内标签/行元素
  7. Hive之表类型解析
  8. 网络安全实效性衡量指南:如何作出准确评估
  9. 北航计算机学院考研英语一还是二,2018北京航空航天大学计算机考研经验分享...
  10. 4g数据需要排序计算机内存,20 亿个数字在 4G 内存中如何去重排序:快来试一试 BitMap...
  11. 当当网复工员工确诊,66人集中隔离,负责人被约谈
  12. mac转换助理安装Windows11
  13. 普歌+阿里云视频点播错误修改
  14. 数字电路-04 触发器Flip-flop!
  15. OGRE+CG学习日记[1]-简单的3D程序
  16. Ubuntu18.04编译Openwrt 15.05.1 Chaos Calmer版本固件遇到的问题汇总
  17. Greenplum Python专用库gppylib学习——base.py
  18. C++贪心——纪念品分组
  19. (分享) 英语邮件要点
  20. 软件测试具有哪些优势

热门文章

  1. 走近分形与混沌(part7)--三体与混沌
  2. numpy基础(part8)--符号数组与矢量化
  3. 正则表达式入门之重复匹配
  4. Hive 空值、NULL判断
  5. SAP UI5 应用开发教程之六十五 - 基于 OData V4 的 SAP UI5 表格控件如何实现创建,编辑和保存功能
  6. 调试 SAP Spartacus 服务器端渲染 SEO HTML Tag 生成逻辑的注意事项
  7. SAP Spartacus批量读取产品的逻辑
  8. Spring JDBC 框架,我的学习笔记
  9. Spring里的容器和Bean对象
  10. SAP Analytics Cloud里Exception Aggregation Type的设置