Python的defaultdict
是collections
模块中的一个非常实用的容器,它可以在访问字典中不存在的键时自动创建默认值。这一特性使得defaultdict
在构建复杂数据结构时变得异常高效,尤其是在涉及多级字典、模拟类对象的动态属性设置与获取、以及实现图的结构时,defaultdict
都有着广泛的应用。
主要特点
与普通的字典不同,defaultdict
在初始化时需要接收一个工厂函数(default factory),这个函数用于产生字典中缺失键的默认值。比如,我们可以使用int
作为factory函数来创建默认值为0的字典,使用list
作为factory函数来创建默认值为空列表的字典。
基本用法
以下是defaultdict
的基本用法示例:
from collections import defaultdict
# 使用整数作为默认工厂
int_dict = defaultdict(int)
print(int_dict['a']) # 输出 0,因为'a'这个键的默认值是0
int_dict['a'] += 1
print(int_dict['a']) # 输出 1
# 使用列表作为默认工厂
list_dict = defaultdict(list)
print(list_dict['b']) # 输出 [],默认值是空列表
list_dict['b'].append(1)
list_dict['b'].append(2)
print(list_dict['b']) # 输出 [1, 2]
应用示例
1. 构建多级字典
defaultdict
非常适合用于构建多级字典。例如,假设我们想要记录一个班级中各个学生的成绩,我们可以使用defaultdict
来动态创建层级字典。
grades = defaultdict(lambda: defaultdict(list))
# 添加成绩
grades['Alice']['math'].append(95)
grades['Alice']['science'].append(90)
grades['Bob']['math'].append(85)
print(grades)
# 输出:defaultdict(<function <lambda> at 0x...>, {'Alice': defaultdict(<class 'list'>, {'math': [95], 'science': [90]}), 'Bob': defaultdict(<class 'list'>, {'math': [85]})})
在这个例子中,我们通过defaultdict
来嵌套另一个defaultdict
,使得我们可以方便地记录每个学生在每门课的成绩。
2. 模拟类对象动态设置和获取属性
另一个常见的用例是模拟一个类对象,使用defaultdict
动态设置和获取属性。
class DynamicAttributes:
def __init__(self):
self.attributes = defaultdict(int) # 默认值为0
def set_attribute(self, key, value):
self.attributes[key] = value
def get_attribute(self, key):
return self.attributes[key]
obj = DynamicAttributes()
obj.set_attribute('speed', 100)
print(obj.get_attribute('speed')) # 输出 100
print(obj.get_attribute('height')) # 输出 0,默认值
3. 实现图的结构
在图论的应用中,defaultdict
也能简化图的构建过程,比如在无向图中,我们可以使用defaultdict(list)
来存储邻接表。
graph = defaultdict(list)
# 添加边
edges = [(1, 2), (1, 3), (2, 3), (3, 4)]
for u, v in edges:
graph[u].append(v)
graph[v].append(u)
print(graph) # 输出: defaultdict(<class 'list'>, {1: [2, 3], 2: [1, 3], 3: [1, 2, 4], 4: [3]})
总结
defaultdict
提供了一种便捷的方式来处理字典中的缺失键问题,使得我们能够快速构建复杂的数据结构和实现动态属性设置。在实际编程中,利用defaultdict
可以大大提高代码的可读性和维护性,是Python开发者必备的工具之一。