Python collections.defaultdict()笔记

版权声明:作者水平有限,博客中难免不少纰漏甚至严重错误,希望大家指正。同时撰写最大的目的也在于交流学习,而不在关注和传播。任重而道远,与您共勉。 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()更多用法可以看博客

猜你喜欢

转载自blog.csdn.net/yexiaohhjk/article/details/88775624