📜  .defaultdict - Python (1)

📅  最后修改于: 2023-12-03 14:38:46.252000             🧑  作者: Mango

defaultdict - Python

在 Python 中, defaultdict 是一个很有用的内置数据结构,它是 dictionary 的一个子类。它重载了一个方法 __missing__(key),提供了一些默认值。可以减少一些代码的复杂度。

基本用法

首先需要从 collections 模块中导入 defaultdict

from collections import defaultdict

接下来就可以创建一个 defaultdict 对象:

d = defaultdict(int)

这里使用 int 类型作为默认值。当试图获得一个不存在的键时,返回 0

>>> d['a']
0

当然,你可以修改默认值:

d2 = defaultdict(list)

通过这个方式,当试图获取一个不存在的键时,返回一个空列表:

>>> d2['a']
[]

如果是构造函数传递函数的一个实例,比如 defaultdict(set),那么每次访问不存在的元素时,会使用一个空的 set() 作为默认值。

defaultdict 与 dict 的区别

defaultdictdict 的区别在于访问一个不存在的键时的行为不同。在 dict 中,如果访问一个不存在的键,会抛出一个 KeyError 异常,而在 defaultdict 中,如果访问一个不存在的键时,会返回对应的默认值。

d = {}  # 空字典
print(d['a'])  # 抛出 KeyError 异常

d2 = defaultdict(int)
print(d2['a'])  # 返回默认值 0
defaultdict 结合 lambda 函数使用

除了使用内置类型作为默认值之外,defaultdict 还可以与 lambda 函数结合使用。

例如,可以为不同的键设置不同的默认值:

d = defaultdict(lambda: 'N/A')

这样,当访问一个不存在的键时,会返回 N/A

>>> d['a']
'N/A'
defaultdict 常见用例

defaultdict 可以用来计数。在通过循环读取文件的行时,可以使用 defaultdict 保存单词列表。如果遇到一个新单词,它的计数会设为 1,否则会加1。

d = defaultdict(int)
with open('file.txt', 'r') as f:
    for line in f:
        for word in line.split():
            d[word] += 1

还可以使用 defaultdict 作为邻接列表来代替普通的在列表中保存元素,然后以这些元素为键的字典。邻接列表是一个有 N 个顶点的列表,其中包含着每个顶点的出边列表。如果需要查找某个顶点的邻居,则直接转到其出边列表。

graph = defaultdict(list)
graph[1].append(2)
graph[1].append(3)
graph[2].append(3)
graph[3].append(1)

print(graph)

输出:

defaultdict(<class 'list'>, {1: [2, 3], 2: [3], 3: [1]})
总结

defaultdictdict 相比,有着更加灵活的默认值设定。而在特定的场景中,使用 defaultdict 非常简单而高效。它可以用来保存各种次数或默认值。