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通过elixir包操作mysql数据库实例代码
Jan 31 Python
python使用sqlite3时游标使用方法
Mar 13 Python
Python生成任意范围任意精度的随机数方法
Apr 09 Python
Python实现一个服务器监听多个客户端请求
Apr 12 Python
Win10下python3.5和python2.7环境变量配置教程
Sep 18 Python
在windows下使用python进行串口通讯的方法
Jul 02 Python
matplotlib实现显示伪彩色图像及色度条
Dec 07 Python
pytorch中的weight-initilzation用法
Jun 24 Python
django模型类中,null=True,blank=True用法说明
Jul 09 Python
利用django创建一个简易的博客网站的示例
Sep 29 Python
python 基于opencv实现高斯平滑
Dec 18 Python
pandas按条件筛选数据的实现
Feb 20 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
经典的PHPer为什么被认为是草根?
2007/04/02 PHP
thinkphp多层MVC用法分析
2015/12/30 PHP
PHP简单留言本功能实现代码
2017/06/09 PHP
PHP APP微信提现接口代码
2018/09/30 PHP
阿里对象存储OSS在laravel框架中的使用方法
2019/10/13 PHP
Yii 框架使用Forms操作详解
2020/05/18 PHP
浅谈PHP中的那些魔术常量
2020/12/02 PHP
JS+JSP checkBox 全选具体实现
2014/01/02 Javascript
Node.js中对通用模块的封装方法
2014/06/06 Javascript
深入理解JavaScript系列(37):设计模式之享元模式详解
2015/03/04 Javascript
jquery中JSON的解析方式
2015/03/16 Javascript
JS+CSS实现带有碰撞缓冲效果的竖向导航条代码
2015/09/15 Javascript
关于session和cookie的简单理解
2016/06/08 Javascript
详解获取jq ul第一个li定位的四种解决方案
2016/11/23 Javascript
JSON与JS对象的区别与对比
2017/03/01 Javascript
详解a++和++a的区别
2017/08/30 Javascript
jQuery与原生JavaScript选择HTML元素集合用法对比分析
2019/11/26 jQuery
js简单粗暴的发布订阅示例代码
2021/01/23 Javascript
python中尾递归用法实例详解
2015/04/28 Python
Python实现Linux的find命令实例分享
2017/06/04 Python
Python爬虫小技巧之伪造随机的User-Agent
2018/09/13 Python
selenium+python自动化测试之使用webdriver操作浏览器的方法
2019/01/23 Python
python 协程 gevent原理与用法分析
2019/11/22 Python
Pytorch数据拼接与拆分操作实现图解
2020/04/30 Python
Python工程师必考的6个经典面试题
2020/06/28 Python
澳大利亚现代波西米亚风格女装网站:Bohemian Traders
2018/04/16 全球购物
英国女性时尚鞋类的潮流制造者:Koi Footwear
2018/10/19 全球购物
香港零食网购:上仓胃子
2020/06/08 全球购物
英国独特家具和家庭用品购物网站:Cuckooland
2020/08/30 全球购物
保护环境的建议书
2014/03/12 职场文书
单位法人授权委托书范本
2014/10/09 职场文书
2014年终个人总结报告
2015/03/09 职场文书
商标侵权律师函
2015/05/27 职场文书
2016年小学生清明节广播稿
2015/12/17 职场文书
60条职场经典语录,总有一条能触动你的心
2019/08/21 职场文书
详解Golang如何实现支持随机删除元素的堆
2022/09/23 Python