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中的相对导入和绝对导入
Jan 06 Python
Python numpy实现数组合并实例(vstack,hstack)
Jan 09 Python
Python实现的简单排列组合算法示例
Jul 04 Python
对Python信号处理模块signal详解
Jan 09 Python
基于python历史天气采集的分析
Feb 14 Python
如何用Python做一个微信机器人自动拉群
Jul 03 Python
pygame实现弹球游戏
Apr 14 Python
Django使用Profile扩展User模块方式
May 14 Python
浅谈Python里面None True False之间的区别
Jul 09 Python
python3 通过 pybind11 使用Eigen加速代码的步骤详解
Dec 07 Python
Python中的min及返回最小值索引的操作
May 10 Python
利用 Python 的 Pandas和 NumPy 库来清理数据
Apr 13 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批量删除数据
2007/01/18 PHP
PHP中source #N问题的解决方法
2014/01/27 PHP
smarty简单分页的实现方法
2014/10/27 PHP
ThinkPHP中使用ajax接收json数据的方法
2014/12/18 PHP
PHP怎样用正则抓取页面中的网址
2016/08/09 PHP
php利用imagemagick实现复古老照片效果实例
2017/02/16 PHP
php使用Swoole实现毫秒级定时任务的方法
2020/09/04 PHP
用JTrackBar实现的模拟苹果风格的滚动条
2007/08/06 Javascript
javascript 禁止复制网页
2009/06/11 Javascript
iframe 异步加载技术及性能分析
2011/07/19 Javascript
判断ie的两种简单方法
2013/08/12 Javascript
jquery特效 点击展示与隐藏全文
2015/12/09 Javascript
javascript执行环境及作用域详解
2016/05/05 Javascript
jquery实现简单Tab切换菜单效果
2020/07/17 Javascript
jQuery+json实现动态创建复杂表格table的方法
2016/10/25 Javascript
微信小程序 自定义对话框实例详解
2017/01/20 Javascript
在Vue组件中使用 TypeScript的方法
2018/02/28 Javascript
vue实现移动端拖动排序
2020/08/21 Javascript
[02:04]2014DOTA2国际邀请赛 BBC小组赛第三天总结
2014/07/12 DOTA
[01:07:34]DOTA2-DPC中国联赛定级赛 RNG vs Aster BO3第二场 1月9日
2021/03/11 DOTA
基于Python log 的正确打开方式
2018/04/28 Python
python游戏开发之视频转彩色字符动画
2019/04/26 Python
python数据预处理之数据标准化的几种处理方式
2019/07/17 Python
Python命令行参数解析工具 docopt 安装和应用过程详解
2019/09/26 Python
python深copy和浅copy区别对比解析
2019/12/26 Python
浅谈Python3实现两个矩形的交并比(IoU)
2020/01/18 Python
推荐技术人员一款Python开源库(造数据神器)
2020/07/08 Python
numpy中生成随机数的几种常用函数(小结)
2020/08/18 Python
Python关于拓扑排序知识点讲解
2021/01/04 Python
PyCharm2020.3.2安装超详细教程
2021/02/08 Python
HTML5中div、article、section的区别及使用介绍
2013/08/14 HTML / CSS
建设工地安全标语
2014/06/07 职场文书
反对形式主义、官僚主义、享乐主义和奢靡之风整改措施
2014/09/17 职场文书
作风建设年活动实施方案
2014/10/24 职场文书
2015年节能减排工作总结
2015/05/14 职场文书
《草虫的村落》教学反思
2016/02/20 职场文书