Python中defaultdict方法的使用详解
defaultdict
是Python标准库collections
中的一个类,它和内置字典(dict
)的用法大致相同,但有一个区别:当你访问一个不存在的键时,defaultdict
会自动创建这个键并将其对应的值赋为一个默认值。
defaultdict的构造函数
defaultdict
的构造函数和dict
的构造函数一样,可以不带任何参数或传入一个迭代器,示例代码如下:
from collections import defaultdict
dd1 = defaultdict() # 没有指定默认值
dd2 = defaultdict(int) # 指定默认值为0
dd3 = defaultdict(lambda: "default value") # 指定默认值为一个自定义的函数,该函数返回"defualt value"
dd4 = defaultdict(list) # 指定默认值为一个空列表
上述代码中,dd1
、dd2
、dd4
的默认值分别为None
、0
、[]
。dd3
则是通过一个lambda函数自定义了一个默认值。
defaultdict示例1:单词计数
假设我们从一个文本文件中读取了一段文本,并想要统计每个单词出现的次数。可以使用defaultdict
来实现这个功能,示例代码如下:
from collections import defaultdict
text = "this is a test, test text. this is text, again."
words = text.split()
# 统计每个单词出现的个数
word_count = defaultdict(int)
for word in words:
word_count[word] += 1
# 按照单词个数从高到低排序,并打印出出现次数最多的前10个单词
sorted_words = sorted(word_count.items(), key=lambda x: x[1], reverse=True)
for word, count in sorted_words[:10]:
print(f"{word}: {count}")
运行上述代码,会输出以下结果:
is: 2
this: 2
test: 2
text: 2
a: 1
again.: 1
test,: 1
上述代码中,我们定义了一个word_count
的defaultdict
,默认值为0。当我们对一个不存在的单词进行访问时,defaultdict
会自动创建这个单词,并将其对应的出现次数初始化为0。随后遍历words
列表,将单词出现次数逐一累加到word_count
中。最后使用sorted
函数和lambda
表达式按照单词出现次数从高到低排序,取出前10个单词输出。
defaultdict示例2:构建树形结构
假设我们想要构建一个树形结构,每个节点包含一个名称和多个子节点,我们可以借助defaultdict
实现这个功能。示例代码如下:
from collections import defaultdict
from pprint import pprint
def add_node(tree, path):
"""
向树形结构中添加一个节点
tree: 根节点
path: 节点的路径,从根节点到该节点的所有名称
"""
node_name = path[0]
if len(path) == 1:
# 递归终止条件:当前节点为叶子节点
tree[node_name] = {}
else:
# 递归调用:创建子节点,并将子节点加入到当前节点的字典中
child_node = tree[node_name]
add_node(child_node, path[1:])
# 构建树形结构
root_node = defaultdict(dict)
add_node(root_node, ["node1", "child1", "grandchild1"])
add_node(root_node, ["node1", "child2", "grandchild2"])
add_node(root_node, ["node2", "child3", "grandchild3"])
# 输出树形结构
pprint(root_node)
运行上述代码,会输出以下结果:
defaultdict(<class 'dict'>,
{'node1': {'child1': {'grandchild1': {}},
'child2': {'grandchild2': {}}},
'node2': {'child3': {'grandchild3': {}}}})
上述代码中,我们定义了一个函数add_node
,用于向树形结构中添加一个节点。该函数的参数tree
是当前节点所属的子树,path
是从根节点到该子树的所有节点名称。具体实现是,将当前节点的名称node_name
从path
中取出,并判断如果子节点列表path
的长度为1,说明当前节点是叶子节点,直接将tree[node_name]
赋为空字典即可;否则将tree[node_name]
赋为一个新的子字典,并递归调用add_node
函数来创建子节点。
在主程序中,我们先定义了一个根节点root_node
,默认值为一个空字典。然后调用add_node
函数向树形结构中添加3个节点。最后使用pprint
函数打印出树形结构,便于观察。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python中defaultdict方法的使用详解 - Python技术站