📅  最后修改于: 2023-12-03 14:38:46.252000             🧑  作者: Mango
在 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
的区别在于访问一个不存在的键时的行为不同。在 dict
中,如果访问一个不存在的键,会抛出一个 KeyError
异常,而在 defaultdict
中,如果访问一个不存在的键时,会返回对应的默认值。
d = {} # 空字典
print(d['a']) # 抛出 KeyError 异常
d2 = defaultdict(int)
print(d2['a']) # 返回默认值 0
除了使用内置类型作为默认值之外,defaultdict
还可以与 lambda
函数结合使用。
例如,可以为不同的键设置不同的默认值:
d = defaultdict(lambda: 'N/A')
这样,当访问一个不存在的键时,会返回 N/A
:
>>> d['a']
'N/A'
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]})
defaultdict
与 dict
相比,有着更加灵活的默认值设定。而在特定的场景中,使用 defaultdict
非常简单而高效。它可以用来保存各种次数或默认值。