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实现子类调用父类的方法
Nov 10 Python
python如何实现远程控制电脑(结合微信)
Dec 21 Python
python实现识别相似图片小结
Feb 22 Python
独特的python循环语句
Nov 20 Python
使用Python实现windows下的抓包与解析
Jan 15 Python
python opencv实现图片旋转矩形分割
Jul 26 Python
python在回调函数中获取返回值的方法
Feb 22 Python
pandas 如何分割字符的实现方法
Jul 29 Python
pytorch获取模型某一层参数名及参数值方式
Dec 30 Python
pandas抽取行列数据的几种方法
Dec 13 Python
pycharm 实现调试窗口恢复
Feb 05 Python
Python爬虫:从m3u8文件里提取小视频的正确操作
May 14 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
经典的星际争霸,满是回忆的BGM
2020/04/09 星际争霸
在PHP中养成7个面向对象的好习惯
2010/01/28 PHP
PHP获取POST数据的几种方法汇总
2015/03/03 PHP
浅谈PDO的rowCount函数
2015/06/18 PHP
php单一接口的实现方法
2015/06/20 PHP
CentOS下PHP7的编译安装及MySQL的支持和一些常见问题的解决办法
2015/12/17 PHP
开启PHP的伪静态模式
2015/12/31 PHP
php简单实现sql防注入的方法
2016/04/22 PHP
PHP实现带重试功能的curl连接示例
2016/07/28 PHP
PHP实现微信图片上传到服务器的方法示例
2017/06/29 PHP
smarty模板的使用方法实例分析
2019/09/18 PHP
jQuery 全选效果实现代码
2009/03/23 Javascript
javascript 无提示关闭窗口脚本
2009/08/17 Javascript
jQuery Clone Bug解决代码
2010/12/22 Javascript
javascript封装的sqlite操作类实例
2015/07/17 Javascript
AngularJS 最常用的功能汇总
2016/02/17 Javascript
JS中setTimeout的巧妙用法前端函数节流
2016/03/24 Javascript
canvas压缩图片转换成base64格式输出文件流
2017/03/09 Javascript
Nodejs进阶之服务端字符编解码和乱码处理
2017/09/04 NodeJs
基于Cookie常用操作以及属性介绍
2017/09/07 Javascript
Bootstrap 树控件使用经验分享(图文解说)
2017/11/06 Javascript
JS和Canvas实现图片的预览压缩和上传功能
2018/03/30 Javascript
vue.js实现点击后动态添加class及删除同级class的实现代码
2018/04/04 Javascript
[02:56]DOTA2亚洲邀请赛 VG出场战队巡礼
2015/02/07 DOTA
[37:21]完美世界DOTA2联赛PWL S2 Inki vs Magma 第二场 11.22
2020/11/24 DOTA
在Django中进行用户注册和邮箱验证的方法
2016/05/09 Python
Django框架设置cookies与获取cookies操作详解
2019/05/27 Python
对django2.0 关联表的必填on_delete参数的含义解析
2019/08/09 Python
Python Selenium XPath根据文本内容查找元素的方法
2020/12/07 Python
Nicole Miller官方网站:纽约女装品牌
2019/09/14 全球购物
深圳-东方伟业笔试部分
2015/02/11 面试题
材料加工工程求职信
2014/02/19 职场文书
大学生个人求职信
2014/06/02 职场文书
2014年班干部工作总结
2014/11/25 职场文书
MySQL主从复制断开的常用修复方法
2021/04/07 MySQL
如何Python使用re模块实现okenizer
2022/04/30 Python