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操作xml文件详细介绍
Jun 09 Python
python基于pyDes库实现des加密的方法
Apr 29 Python
Python中元组,列表,字典的区别
May 21 Python
python逆序打印各位数字的方法
Jun 25 Python
python中dir()与__dict__属性的区别浅析
Dec 10 Python
Python实现K折交叉验证法的方法步骤
Jul 11 Python
Django REST框架创建一个简单的Api实例讲解
Nov 05 Python
使用 Supervisor 监控 Python3 进程方式
Dec 05 Python
Python 文件数据读写的具体实现
Jan 24 Python
基于python连接oracle导并出数据文件
Apr 28 Python
Python Charles抓包配置实现流程图解
Sep 29 Python
python中的unittest框架实例详解
Feb 05 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与php MySQL 之间的关系
2009/07/17 PHP
PHP CKEditor 上传图片实现代码
2009/11/06 PHP
PHP 采集程序原理分析篇
2010/03/05 PHP
PHP转换文件夹下所有文件编码的实现代码
2013/06/06 PHP
Zend Framework教程之视图组件Zend_View用法详解
2016/03/05 PHP
jquery 页面全选框实践代码
2010/04/02 Javascript
理解Javascript_14_函数形式参数与arguments
2010/10/20 Javascript
jQuery使用一个按钮控制图片的伸缩实现思路
2013/04/19 Javascript
JavaScript中对象属性的添加和删除示例
2014/05/12 Javascript
JavaScript获取当前网页标题(title)的方法
2015/04/03 Javascript
在easyUI开发中,出现jquery.easyui.min.js函数库问题的解决办法
2015/09/11 Javascript
jQuery插件Validate实现自定义表单验证
2016/01/18 Javascript
即将发布的jQuery 3 有哪些新特性
2016/04/14 Javascript
jQuery数据检索中根据关键字快速定位GridView指定行的实现方法
2016/06/08 Javascript
Node.js数据库操作之查询MySQL数据库(二)
2017/03/04 Javascript
Vue应用部署到服务器的正确方式
2017/07/15 Javascript
Vue.js 实现微信公众号菜单编辑器功能(二)
2018/05/08 Javascript
浅谈关于iview表单验证的问题
2018/09/29 Javascript
手动下载Chrome并解决puppeteer无法使用问题
2018/11/12 Javascript
通过seajs实现JavaScript的模块开发及按模块加载
2019/06/06 Javascript
node创建Vue项目步骤详解
2020/03/06 Javascript
Vue-cli 移动端布局和动画使用详解
2020/08/10 Javascript
jQuery实现计算器功能
2020/10/19 jQuery
[07:39]第一届亚洲邀请赛回顾视频
2017/02/14 DOTA
Python常用知识点汇总
2016/05/08 Python
Python3.6.x中内置函数总结及讲解
2019/02/22 Python
Python实现朴素贝叶斯的学习与分类过程解析
2019/08/24 Python
parser.add_argument中的action使用
2020/04/20 Python
CSS3教程:新增加的结构伪类
2009/04/02 HTML / CSS
Html5踩坑记之mandMobile使用小记
2020/04/02 HTML / CSS
喷漆工的岗位职责
2014/03/17 职场文书
党建工作先进材料
2014/05/02 职场文书
美术社团活动总结
2014/06/27 职场文书
中秋节晚会开场白
2015/05/29 职场文书
2019中秋节祝福语大全,提前收藏啦
2019/09/10 职场文书
Python实现数据的序列化操作详解
2022/07/07 Python