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 list操作用法总结
Nov 10 Python
Python画柱状统计图操作示例【基于matplotlib库】
Jul 04 Python
在pandas多重索引multiIndex中选定指定索引的行方法
Nov 16 Python
Python进阶之全面解读高级特性之切片
Feb 19 Python
Django 配置多站点多域名的实现步骤
May 17 Python
利用anaconda保证64位和32位的python共存
Mar 09 Python
对django中foreignkey的简单使用详解
Jul 28 Python
Django 1.10以上版本 url 配置注意事项详解
Aug 05 Python
Django框架序列化与反序列化操作详解
Nov 01 Python
浅谈django 重载str 方法
May 19 Python
python基础之停用词过滤详解
Apr 21 Python
pandas中DataFrame数据合并连接(merge、join、concat)
May 30 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 截取字符串函数整理(支持gb2312和utf-8)
2010/02/16 PHP
PHP源码之explode使用说明
2011/08/05 PHP
php中使用preg_replace函数匹配图片并加上链接的方法
2013/02/06 PHP
php常用ODBC函数集(详细)
2013/06/24 PHP
php中in_array函数用法分析
2014/11/15 PHP
PHP随手笔记整理之PHP脚本和JAVA连接mysql数据库
2015/11/25 PHP
Swoole源码中如何查询Websocket的连接问题详解
2020/08/30 PHP
jquery的ajax从纯真网(cz88.net)获取IP地址对应地区名
2009/12/02 Javascript
jQuery 改变CSS样式基础代码
2010/02/11 Javascript
js改变文章字体大小的实例代码
2013/11/27 Javascript
jQuery插件扩展测试实例
2016/06/21 Javascript
jquery控制页面的展开和隐藏实现方法(推荐)
2016/10/15 Javascript
Vue.js 2.0 移动端拍照压缩图片预览及上传实例
2017/04/27 Javascript
详解使用vue实现tab 切换操作
2017/07/03 Javascript
实例分析编写vue组件方法
2019/02/12 Javascript
微信小程序五子棋游戏的悔棋实现方法【附demo源码下载】
2019/02/20 Javascript
使用koa2创建web项目的方法步骤
2019/03/12 Javascript
利用JavaScript的Map提升性能的方法详解
2019/08/14 Javascript
layui-table获得当前行的上/下一行数据的例子
2019/09/24 Javascript
[41:05]Serenity vs Pain 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
查看python下OpenCV版本的方法
2018/08/03 Python
Django2.1.3 中间件使用详解
2018/11/26 Python
调整Jupyter notebook的启动目录操作
2020/04/10 Python
Python爬虫爬取微信朋友圈
2020/08/06 Python
Python -m参数原理及使用方法解析
2020/08/21 Python
Python Selenium实现无可视化界面过程解析
2020/08/25 Python
css3的transition属性详解
2014/12/15 HTML / CSS
澳大利亚家具和家居用品在线:BROSA
2017/11/02 全球购物
如何配置、使用和清除Smarty缓存
2015/12/23 面试题
高中毕业自我鉴定范文
2013/10/02 职场文书
警示教育活动总结
2014/05/05 职场文书
如何写贫困证明申请书
2014/10/29 职场文书
经典爱情感言
2015/08/03 职场文书
2016年八一建军节活动总结
2016/04/05 职场文书
图文详解nginx日志切割的实现
2022/01/18 Servers
nginx负载功能+nfs服务器功能解析
2022/02/28 Servers