版权声明:作者水平有限,博客中难免不少纰漏甚至严重错误,希望大家指正。同时撰写最大的目的也在于交流学习,而不在关注和传播。任重而道远,与您共勉。 https://blog.csdn.net/yexiaohhjk/article/details/88775624
与dict的差别
其实defaultdict解释是数据类型容器模块,本质就是一个字典(dict),只不过python自动的为它的键赋了一个初始值。
为什么要定义一个这样容器呢?
因为Python中dict是通过Key访问字典,当Key不存在时,会引发‘KeyError’异常。为了避免这种情况的发生,可以使用collections类中的defaultdict()方法来为字典提供默认值。
比如你想计算频率:
wordlist = ['a','b','b','c','e','e','e']
frequencies = {}
for word in wordlist:
frequencies[word] += 1
python会抛出一个KeyError 异常,因为字典索引之前必须初始化,可以用下面的方法解决:
wordlist = ['a','b','b','c','e','e','e']
frequencies = {}
for word in wordlist:
try:
frequencies[word] += 1
except Exception:
frequencies[word] = 1
print('word:',frequencies)
wordlist = ['a','b','b','c','e','e','e']
for word in wordlist:
if word in frequencies:
frequencies[word] += 1
else:
frequencies[word] = 1
collections.defaultdict使用
而collections.defaultdict也可以轻松的解决这个问题:
from collections import defaultdict
wordlist = ['a','b','b','c','e','e','e']
frequencies = defaultdict(int)
for word in wordlist:
frequencies[word] += 1
collections.defaultdict可以接受一个函数作为参数来初始化。我们想要frequencies[word]初始化为0,这时就可以用一个int()
的内建函数作为参数出给defaultdict,我们不带参数调用int(),int()就会返回一个0值. 同时也可以用python其他类型的内建函数list()
等作为参数.
比如:
import collections
s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
# defaultdict
d = collections.defaultdict(list)
for k, v in s:
d[k].append(v)
# Use dict and setdefault
g = {}
for k, v in s:
g.setdefault(k, []).append(v)
这里setdefault()
也可以实现dict初始化默认类型的作用:
如果键不存在于字典中,将会添加该键并将default的值设为该键的默认值,如果键存在于字典中,将读出该键原来对应的值,default的值不会覆盖原来已经存在的键的值。
dict.setdefault(key, default=None)
关于setdefault()
更多用法可以看博客.