Python collections.defaultdict模块用法详解


Posted in Python onJune 18, 2020

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

语法格式:

collections.defaultdict([default_factory[, …]])
class defaultdict(Dict[_KT, _VT], Generic[_KT, _VT]):
default_factory: Callable[[], _VT]

该函数返回一个类似字典的对象。defaultdict是Python内建字典类(dict)的一个子类,它重写了方法_missing_(key),增加了一个可写的实例变量default_factory,实例变量default_factory被missing()方法使用,如果该变量存在,则用以初始化构造器,如果没有,则为None。其它的功能和dict一样。

第一个参数为default_factory属性提供初始值,默认为None;其余参数包括关键字参数(keyword arguments)的用法,和dict构造器用法一样。

1.使用list作第一个参数,可以很容易将键-值对序列转换为列表字典。

from collections import defaultdict
s=[('yellow',1),('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
d=defaultdict(list)
for k, v in s:
  d[k].append(v)
a=sorted(d.items())
print d
print a

'''
defaultdict(<type 'list'>, {'blue': [2, 4], 'red': [1], 'yellow': [1, 3]})
[('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]

'''

当字典中没有的键第一次出现时,default_factory自动为其返回一个空列表,list.append()会将值添加进新列表;再次遇到相同的键时,list.append()将其它值再添加进该列表。

这种方法比使用dict.setdefault()更为便捷,dict.setdefault()也可以实现相同的功能。

s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
d={}
for k, v in s:
  d.setdefault(k,[]).append(v)
print d
a=sorted(d.items())
print a

'''
{'blue': [2, 4], 'red': [1], 'yellow': [1, 3]}
[('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]
'''

2.defaultdict还可以被用来计数,将default_factory设为int即可。

s = 'mississippi'
d = defaultdict(int)
for k in s:
  d[k] += 1
print d
a=sorted(d.items())
print a
'''
defaultdict(<type 'int'>, {'i': 4, 'p': 2, 's': 4, 'm': 1})
[('i', 4), ('m', 1), ('p', 2), ('s', 4)]
'''

字符串中的字母第一次出现时,字典中没有该字母,default_factory函数调用int()为其提供一个默认值0,加法操作将计算出每个字母出现的次数。

函数int()是常值函数的一种特例,总是返回0。使用匿名函数(lambda function)可以更快、更灵活的创建常值函数,返回包括0在内的任意常数值。

def constant_factory(value):
  return lambda: value
d = defaultdict(constant_factory('<missing>'))
print d
d.update(name='John', action='ran')
print d
print '%(name)s %(action)s to %(object)s' % d 
'''
defaultdict(<function <lambda> at 0x10c180668>, {})
defaultdict(<function <lambda> at 0x10c180668>, {'action': 'ran', 'name': 'John'})
John ran to <missing>
'''

3.default_factory设为set时,可以用defaultdict建立集合字典(a dictionary of sets)

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
a=sorted(d.items())
print a
'''
defaultdict(<type 'set'>, {'blue': set([2, 4]), 'red': set([1, 3])})
[('blue', set([2, 4])), ('red', set([1, 3]))]
'''

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python脚本实现下载合并SAE日志
Feb 10 Python
django实现同一个ip十分钟内只能注册一次的实例
Nov 03 Python
python 获得任意路径下的文件及其根目录的方法
Feb 16 Python
python中时间模块的基本使用教程
May 14 Python
Django自定义模板过滤器和标签的实现方法
Aug 21 Python
Python 切分数组实例解析
Nov 07 Python
python 实现方阵的对角线遍历示例
Nov 29 Python
pd.DataFrame统计各列数值多少的实例
Dec 05 Python
PyQT5 emit 和 connect的用法详解
Dec 13 Python
如何基于Python制作有道翻译小工具
Dec 16 Python
python序列化与数据持久化实例详解
Dec 20 Python
代码复现python目标检测yolo3详解预测
May 06 Python
python实现批量命名照片
Jun 18 #Python
pandas之分组groupby()的使用整理与总结
Jun 18 #Python
解决Keyerror ''acc'' KeyError: ''val_acc''问题
Jun 18 #Python
Python调用shell cmd方法代码示例解析
Jun 18 #Python
Python如何自动获取目标网站最新通知
Jun 18 #Python
浅谈keras使用中val_acc和acc值不同步的思考
Jun 18 #Python
python实现在线翻译
Jun 18 #Python
You might like
php 缩略图实现函数代码
2011/06/23 PHP
浅析HTTP消息头网页缓存控制以及header常用指令介绍
2013/06/28 PHP
浅析php中json_encode()和json_decode()
2014/05/25 PHP
PHP类的封装与继承详解
2015/09/29 PHP
Laravel框架路由和控制器的绑定操作方法
2018/06/12 PHP
PHP 对象继承原理与简单用法示例
2020/04/21 PHP
javascript中clone对象详解
2014/12/03 Javascript
js实现仿百度瀑布流的方法
2015/02/05 Javascript
js实现网站最上边可关闭的浮动广告条代码
2015/09/04 Javascript
JavaScript动态设置div的样式的方法
2015/12/26 Javascript
vue深入解析之render function code详解
2017/07/18 Javascript
vue中添加mp3音频文件的方法
2018/03/02 Javascript
webpack+vuex+axios 跨域请求数据的示例代码
2018/03/06 Javascript
vue将毫秒数转化为正常日期格式的实例
2018/09/16 Javascript
详解VUE里子组件如何获取父组件动态变化的值
2018/12/26 Javascript
Layer+Echarts构建弹出层折线图的方法
2019/09/25 Javascript
js实现省级联动(数据结构优化)
2020/07/17 Javascript
彻底搞懂并解决vue-cli4中图片显示的问题实现
2020/08/31 Javascript
微信小程序实现多行文字滚动
2020/11/18 Javascript
Node.js文本文件BOM头的去除方法
2020/11/22 Javascript
[02:27]2014DOTA2国际邀请赛 VG赛后采访:更大的挑战在等着我们
2014/07/13 DOTA
Python自定义类的数组排序实现代码
2016/08/28 Python
python实现的多线程端口扫描功能示例
2017/01/21 Python
python进阶之多线程对同一个全局变量的处理方法
2018/11/09 Python
python实现手机销售管理系统
2019/03/19 Python
Android面试题附答案
2014/12/08 面试题
什么是事务?事务有哪些性质?
2012/03/11 面试题
计算机网络专业推荐信
2013/11/24 职场文书
出国考察邀请函
2014/01/21 职场文书
有创意的广告词
2014/03/18 职场文书
生物技术专业求职信
2014/06/10 职场文书
Python基于Opencv识别两张相似图片
2021/04/25 Python
Django使用redis配置缓存的方法
2021/06/01 Redis
使用python将HTML转换为PDF pdfkit包(wkhtmltopdf) 的使用方法
2022/04/21 Python
SQL Server使用CROSS APPLY与OUTER APPLY实现连接查询
2022/05/25 SQL Server
从原生JavaScript到React深入理解
2022/07/23 Javascript