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计数排序和基数排序算法实例
Apr 25 Python
Python环境变量设置方法
Aug 28 Python
浅谈django中的认证与登录
Oct 31 Python
Python使用matplotlib绘制正弦和余弦曲线的方法示例
Jan 06 Python
对pandas将dataframe中某列按照条件赋值的实例讲解
Nov 29 Python
使用python判断你是青少年还是老年人
Nov 29 Python
Django在admin后台集成TinyMCE富文本编辑器的例子
Aug 09 Python
python生成器用法实例详解
Nov 22 Python
Pyecharts绘制全球流向图的示例代码
Jan 08 Python
python实现程序重启和系统重启方式
Apr 16 Python
python 实现两个npy档案合并
Jul 01 Python
详解Anaconda 的安装教程
Sep 23 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 INI配置文件的解析实现分析
2011/01/04 PHP
PHP中使用curl伪造IP的简单方法
2015/08/07 PHP
什么是OneThink oneThink后台添加插件步骤
2016/04/13 PHP
基于jQueryUI和Corethink实现百度的搜索提示功能
2016/11/09 PHP
关于PHP5.6+版本“No input file specified”问题的解决
2019/12/11 PHP
JS代码格式化和语法着色V2
2006/10/14 Javascript
JavaScript定义类或函数的几种方式小结
2011/01/09 Javascript
BAT及各大互联网公司2014前端笔试面试题--JavaScript篇
2014/10/29 Javascript
jQuery中inArray方法注意事项分析
2016/01/25 Javascript
node.js插件nodeclipse安装图文教程
2020/10/19 Javascript
分享12个非常实用的JavaScript小技巧
2016/05/11 Javascript
js简单正则验证汉字英文及下划线的方法
2016/11/28 Javascript
利用CSS、JavaScript及Ajax实现图片预加载的方法
2016/11/29 Javascript
使用微信小程序开发前端【快速入门】
2016/12/05 Javascript
js 监控iframe URL的变化实例代码
2017/07/12 Javascript
socket在egg中的使用实例代码详解
2019/05/30 Javascript
vue中node_modules中第三方模块的修改使用详解
2019/05/31 Javascript
微信小游戏之使用three.js 绘制一个旋转的三角形
2019/06/10 Javascript
解决layer.open弹出框不能获取input框的值为空的问题
2019/09/10 Javascript
Vue实现push数组并删除的例子
2019/11/01 Javascript
Python实现的下载网页源码功能示例
2017/06/13 Python
Python+Selenium+PIL+Tesseract自动识别验证码进行一键登录
2017/09/20 Python
Python模块的加载讲解
2019/01/15 Python
华为2019校招笔试题之处理字符串(python版)
2019/06/25 Python
OpenCV+face++实现实时人脸识别解锁功能
2019/08/28 Python
PyInstaller运行原理及常用操作详解
2020/06/13 Python
Python使用xpath实现图片爬取
2020/09/16 Python
input file上传文件样式支持html5的浏览器解决方案
2012/11/14 HTML / CSS
阿里健康官方海外旗舰店:阿里健康国际自营
2017/11/24 全球购物
Lookfantastic希腊官网:英国知名美妆购物网站
2018/09/15 全球购物
室内设计专业个人的自我评价
2013/10/19 职场文书
大学生优秀的自我评价分享
2013/10/22 职场文书
个人求职信范文分享
2014/01/06 职场文书
男性健康日的活动方案
2014/08/18 职场文书
Python图片检索之以图搜图
2021/05/31 Python
Spring Security中用JWT退出登录时遇到的坑
2021/10/16 Java/Android