栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

儿童python教程222:Python defaultdict用法(带实例分析)

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

儿童python教程222:Python defaultdict用法(带实例分析)

defaultdict 是 dict 的子类,因此 defaultdict 也可被当成 dict 来使用,dict 支持的功能,defaultdict 基本都支持。但它与 dict **大的区别在于,如果程序试图根据不存在的 key 采访问 dict 中对应的 value,则会引发 KeyError 异常;而 defaultdict 则可以提供一个 default_factory 属性,该属性所指定的函数负责为不存在的 key 来生成 value。

通过下面程序进行对比:

from collections import defaultdict

my_dict = {}

# 使用int作为defaultdict的default_factory

# 将key不存在时,将会返回int()函数的返回值

my_defaultdict = defaultdict(int)

print(my_defaultdict['a']) # 0

print(my_dict['a']) # KeyError
上面程序分别创建了空的 dict 对象和 defaultdict 对象,当程序试图访问 defaultdict 中不存在的 key 对应的 value 时,程序输出 defaultdict 的 default_factory 属性(int 函数)的返回值 0;如果程序试图访问 dict 中不存在的 key 对应的 value,就会引发 KeyError 异常。

假如程序中包含多个 key-value 对数据,在这些 key-value 对中有些 key 是重复的,程序希望对这些 key-value 对进行整理,key 对应一个 list,该 list 中包含这组数据中该 key 对应的所有 value。

下面先使用普通 dict 来完成这项工作:

s = [('Python', 1), ('Swift', 2), ('Python', 3), ('Swift', 4), ('Python', 9)]

d = {}

for k, v in s:

    # setdefault()方法用于获取指定key对应的value.

    # 如果该key不存在,则先将该key对应的value设置为默认值:[]

    d.setdefault(k, []).append(v)

print(list(d.items()))
正如从上面第 6 行代码所看到的,如果使用普通 dict 来处理,就需要处理 key 不存在的情况。程序中使用了 dict 的 setdefault() 方法,该方法用于获取指定 key 对应的 value,但如果该 key 不存在,setdefault() 方法就会先为该 key 设置一个默认的 value。

运行上面程序,可以看到如下输出结果:

[('Python', [1, 3, 9]), ('Swift', [2, 4])]


如果使用 defaultdict 来处理则简单得多,因为程序可以直接为 defaultdict 中不存在的 key 设置默认的 value。该处理程序如下:

from collections import defaultdict

s = [('Python', 1), ('Swift', 2), ('Python', 3), ('Swift', 4), ('Python', 9)]

# 创建defaultdict,设置由list()函数来生成默认值

d = defaultdict(list)

for k, v in s:

    # 直接访问defaultdict中指定key对应的value即可。

    # 如果该key不存在,defaultdict会自动为该key生成默认值

    d[k].append(v)

print(list(d.items()))
对比该程序中的第 8 行代码和前一个程序中的第 6 行代码,不难发现使用 defaultdict 更加方便,原因是程序直接访问 defaultdict 中指定的 key 对应的 value,如果该 key 不存在,程序在创建 defaultdict 时传入的 list 函数将会为之生成默认的 value。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/805908.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号