defaultdict

defaultdict 是 dict 类型的子类,正如其名,初始化时,可以给key指定默认值。

如果是普通的dict对象,访问一个不存在的key时,会报错:

dict1 = dict()
print(dict1['a'])
KeyError: 'a'

而使用defaultdict,dict中不存在key ,会输出默认的初始值,例如,设置默认空列表dict,返回也是[]:

from collections import defaultdictres1 = defaultdict(list)
print(res1['a'])  # []
print(res1.get('a'))  # []
print(res1.get('a', 'hello world 1'))  # []

默认给一个0的dict:

from collections import defaultdictres2 = defaultdict(int)
print(res2['a'])  # 0
print(res2.get('a'))  # 0
print(res2.get('a', 'hello world 2'))  # 0

defaultdict方法接收的参数是一个可调用对象,可以简单理解为一个函数对象,我们知道python中一切皆对象,int、list本来以上一个函数对象,这里如果想要默认值不是0,而是999,该怎么处理呢?

使用匿名函数,指定defaultdict默认值

from collections import defaultdictres3 = defaultdict(lambda: 999)
print(res3['b'])  # 999
print(res3.get('b'))  # 999
print(res3.get('b', 0))  # 999

当然也可以使用自定义函数,指定defaultdict默认值:

from collections import defaultdictdef get_default():return 'Hello World !'res4 = defaultdict(get_default)
print(res4['b'])  # Hello World !
print(res4.get('b'))  # Hello World !
print(res4.get('b', 0))  # Hello World !
  • 关于defaultdict的一些应用场景:

场景一:我们经常想要将一个列表中的数据进行整合,比如这种:

initial_data = [('class1', '张三'), ('class2', '李四'), ('class1', '王五'),('class3', '赵六'), ('class3', '李刚弹'), ('class2', '王大炮'),('class1', '王大锤'), ('class2', '李二狗'), ('class1', '佚名')]

变成:

finally_data = {'class1': ['张三', '王五', '王大锤', '佚名'],'class2': ['李四', '王大炮', '李二狗', ],'class3': ['赵六', '李刚弹']
}

如果自己实现的话可能会用for循环依次判断,又或者使用到setdefault方法也可以。这里如果使用defaultdict方法算是一种比较优雅的解决:

res5 = defaultdict(list)
for k, v in initial_data:res5[k].append(v)print(res5 == finally_data)  # True
}

附:使用setdefault也可以优雅的解决

res6 = {}
for k, v in initial_data:res6.setdefault(k, []).append(v)print(res6 == finally_data)  # True

参考:
https://www.cnblogs.com/thsk/p/8404425.html

collections的defaultdict使用相关推荐

  1. collections之defaultdict

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

  2. 构造函数= default;_Python Collections之defaultdict 和 default_factory关系

    容器(collections)是Python附带一个模块,它包含许多容器数据类型,今天先拿出defaultdict来说. dict在python中是非常常见的一种数据类型. colours = ((' ...

  3. python中的defaultdict_简介Python的collections模块中defaultdict类型的用法

    defaultdict 主要用来需要对 value 做初始化的情形.对于字典来说,key 必须是 hashable,immutable,unique 的数据,而 value 可以是任意的数据类型.如果 ...

  4. collections模块之defaultdict

    初识defaultdict 之前在使用字典的时候, 用的比较随意, 只是简单的使用dict. 然而这样在使用不存在的key的时候发生KeyError这样的一个报错, 这时候就该defaultdict登 ...

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

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

  6. python︱ collections模块(namedtuple/defaultdict/OrderedDict等)

    collections有的功能: ['deque', 'defaultdict', 'namedtuple', 'UserDict', 'UserList', 'UserString',\'Count ...

  7. Collections中Counter函数,namedtuple函数,defaultdict函数的使用

    #python中collections工具包的一点使用 #组织特征数据用namedtuple函数 from collections import namedtuple Features = named ...

  8. collections.defaultdict

    python 简单数据分析 collections. 这个模块提供容器相关的更高性能的数据类型,它们提供比通用容器 dict, list, set 和tuple更强大的功能. **collection ...

  9. 关于python中的dict和defaultdict

    dict 在Python中如果访问字典中不存在的键,会引发KeyError异常,所以一般当我们比如统计一句话的词频时候,我们总是使用这样的处理方式: strings = ('puppy', 'kitt ...

  10. python3 collections模块_Python3之内建模块collections

    collections是python内建的一个集合模块,提供了许多有用的集合类. namedtuple 我们知道tuple可以表示不可变集合,例如,一个点的二维坐标可以表示成 >>> ...

最新文章

  1. sass的继承,混合宏,占位符的用法总结
  2. windows1064安装oracle,在Windows 10系统下安装Oracle 11g数据库
  3. linux创建sftp用户并指定访问目录,linux – 创建SFTP用户只能访问一个目录.
  4. centos7设置时间为日本东京时间
  5. 13.8.可视化虚拟机工具--Jconsole内存监控、13.9.可视化虚拟机工具--Jconsole线程监控、13.10.死锁原理以及可视化虚拟机工具--Jconsole线程
  6. java自动关闭吗_JAVA问题--浏览器老是自动关闭
  7. 洛谷P6097:【模板】子集卷积(FWT)
  8. android上运行java命令,Java exec()不在android上运行busybox命令
  9. 完全卸载gitlab
  10. bitcount java_Java Long bitCount()方法
  11. Null + Anything = null, 好奇怪的设定啊
  12. vue 使用了浏览器的刷新之后报错_98、解决vue-cli3项目运行时sockjs报错问题
  13. PyCharm中的一些设置
  14. 局域网ip扫描工具_IP Scanner局域网IP扫描工具
  15. 使用谷歌API将任意语言翻译成英文
  16. 骗子网站--正规网赚系统--www.j9m2.com--诈骗网站
  17. 从Bitly构建分布式系统中吸取的教训
  18. RFID智能档案管理系统 设计方案
  19. 为什么空集是集合的子集_空集为什么是任何集合的子集和非任何空集的真子集呢...
  20. android4.1不支持微信,华为EMUI 4.1(android6.0)手机能否安装微信小程序?

热门文章

  1. codeforces 733D
  2. PE文件格式详解(下)
  3. 关于jstl EL用法的注意点(java.lang.NumberFormatException: For input string: userName)
  4. 编程经历的一些思考——一个工作4年老鸟的职业思考(转载)
  5. 【亲测有效】vs2017无法断点
  6. new Image().src资源重复请求问题
  7. 一道不知道哪里来的容斥题
  8. bzoj1853幸运数字——容斥原理
  9. 【BZOJ-2768】冠军调查 最小割
  10. Makefile--基本规则(零)