defaultdict

Posted beautifulworld

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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。

defaultdict的参数为默认返回值,当传一个对象时,默认返回这个对象


以上是关于defaultdict的主要内容,如果未能解决你的问题,请参考以下文章