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 相关文章推荐
Hadoop中的Python框架的使用指南
Apr 22 Python
python编程开发之类型转换convert实例分析
Nov 13 Python
python中使用正则表达式的后向搜索肯定模式(推荐)
Nov 11 Python
Python获取一个用户名的组ID过程解析
Sep 03 Python
余弦相似性计算及python代码实现过程解析
Sep 18 Python
python如何提取英语pdf内容并翻译
Mar 03 Python
python 实现 hive中类似 lateral view explode的功能示例
May 18 Python
keras的siamese(孪生网络)实现案例
Jun 12 Python
详解pyinstaller生成exe的闪退问题解决方案
Jun 19 Python
用python-webdriver实现自动填表的示例代码
Jan 13 Python
Django url 路由匹配过程详解
Jan 22 Python
Python如何利用正则表达式爬取网页信息及图片
Apr 17 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导出oracle库的php代码
2009/04/20 PHP
Smarty中常用变量操作符汇总
2014/10/27 PHP
thinkphp3.0输出重复两次的解决方法
2014/12/19 PHP
php将csv文件导入到mysql数据库的方法
2014/12/24 PHP
php版微信js-sdk支付接口类用法示例
2016/10/12 PHP
yii框架结合charjs统计上一年与当前年数据的方法示例
2020/04/04 PHP
IE与firefox之jquery用法区别
2008/10/03 Javascript
JavaScript 命名空间 使用介绍
2013/08/29 Javascript
JS判断字符串长度的5个方法(区分中文和英文)
2014/03/18 Javascript
javascript移动设备Web开发中对touch事件的封装实例
2014/06/05 Javascript
js+jquery常用知识点汇总
2015/03/03 Javascript
jquery实现经典的淡入淡出选项卡效果代码
2015/09/22 Javascript
微信小程序前端源码逻辑和工作流
2016/09/25 Javascript
jQuery插件zTree实现删除树节点的方法示例
2017/03/08 Javascript
完美实现js拖拽效果 return false用法详解
2017/07/28 Javascript
jQuery ajax仿Google自动提示SearchSuggess功能示例
2019/03/28 jQuery
vue移动端屏幕适配详解
2019/04/30 Javascript
node将geojson转shp返回给前端的实现方法
2019/05/29 Javascript
Vue 2.0 侦听器 watch属性代码详解
2019/06/19 Javascript
javascript将扁平的数据转为树形结构的高效率算法
2020/02/27 Javascript
用Python编写web API的教程
2015/04/30 Python
python模块之re正则表达式详解
2017/02/03 Python
浅谈python中的数字类型与处理工具
2017/08/02 Python
PyQt 图解Qt Designer工具的使用方法
2019/08/06 Python
利用python计算时间差(返回天数)
2019/09/07 Python
Python标准库shutil模块使用方法解析
2020/03/10 Python
自学python用什么系统好
2020/06/23 Python
jupyter notebook快速入门及使用详解
2020/11/13 Python
Kiehl’s科颜氏西班牙官方网站:源自美国的植物护肤品牌
2020/02/22 全球购物
化工工艺专业求职信
2013/09/22 职场文书
项目专员岗位职责
2013/12/04 职场文书
学校扫黄打非工作总结
2015/10/15 职场文书
2016年公司中秋节致辞
2015/11/26 职场文书
银行培训心得体会范文
2016/01/09 职场文书
2019年二手房买卖合同范本
2019/10/14 职场文书
Win11 25163.1010更新补丁KB5016904推送,测试服务验证管道(附更新修复汇总)
2022/07/23 数码科技