文章目录
- collections.defaultdict()
- dict()
collections.defaultdict()
mp = collections.defaultdict(list)
是在Python中创建一个特殊类型的字典,称为默认字典(defaultdict)。这行代码的含义和作用如下:
-
collections
是Python的一个内置模块,提供了一些特殊的容器数据类型。 -
defaultdict
是collections
模块中的一个类,它是Python内置dict
类的一个子类。 -
defaultdict(list)
创建一个默认值为空列表的字典。 -
当你尝试访问字典中不存在的键时:
- 普通的字典会抛出
KeyError
。 defaultdict
会自动为该键创建一个默认值,在这里是一个空列表[]
。
- 普通的字典会抛出
主要特点和用途:
-
自动初始化:不需要检查键是否存在就可以直接追加元素。
-
简化代码:减少了手动初始化和检查的代码量。
-
常用于需要在字典值中存储多个项目的场景。
示例用法:
from collections import defaultdict
mp = defaultdict(list)
# 添加元素
mp['a'].append(1) # 即使 'a' 不存在,也不会报错
mp['a'].append(2)
mp['b'].append(3)
print(mp) # 输出:defaultdict(<class 'list'>, {'a': [1, 2], 'b': [3]})
# 访问不存在的键
print(mp['c']) # 输出:[] (自动创建空列表,而不是抛出错误)
在算法问题中,defaultdict(list)
经常用于需要将多个值关联到同一个键的情况,例如图的邻接表表示、单词分组等场景。它可以让代码更加简洁和高效。
dict()
mp = dict()
和 mp = collections.defaultdict(list)
之间有几个关键区别:
-
处理不存在的键:
- 普通字典
dict()
:当访问不存在的键时,会抛出 KeyError。 defaultdict(list)
:当访问不存在的键时,会自动创建一个空列表作为值。
- 普通字典
-
初始化和使用方式:
- 普通字典:需要先检查键是否存在,然后再操作。
defaultdict(list)
:可以直接操作,无需预先检查。
-
默认值:
- 普通字典:没有默认值的概念。
defaultdict(list)
:指定了默认值类型(这里是列表)。
-
代码简洁性:
defaultdict
通常可以让代码更简洁,尤其是在处理嵌套结构时。
示例对比:
# 使用普通字典
mp_dict = dict()
key = "example"
if key not in mp_dict:
mp_dict[key] = []
mp_dict[key].append(1)
# 使用 defaultdict
from collections import defaultdict
mp_defaultdict = defaultdict(list)
mp_defaultdict["example"].append(1) # 无需检查键是否存在
主要优势:
- 代码更简洁:减少了键存在性检查的代码。
- 减少错误:避免了因忘记初始化而导致的 KeyError。
- 更适合某些特定场景:如需要为每个键维护一个列表或集合时。
然而,普通字典在某些情况下可能更合适:
- 当你不希望自动创建默认值时。
- 当你需要区分"键不存在"和"键存在但值为空"的情况时。
- 当默认值不是固定类型,而是需要动态决定时。
选择使用哪种取决于具体的使用场景和需求。defaultdict
在需要为键自动初始化特定类型的值(如列表、集合、整数等)时特别有用。