这次让我们关注 collections
模块中的一个非常有用的小技巧,使用 defaultdict
来处理字典中的缺失键。
defaultdict 使用技巧
在使用普通的字典对象时,如果尝试访问字典中不存在的键,Python 会引发一个 KeyError
异常。而在很多场景下,我们希望当访问一个不存在的键时,字典能自动为我们创建这个键并分配一个默认值,这正是 defaultdict
能做到的。
collections.defaultdict
类接收一个工厂函数作为参数,当访问不存在的键时,它会自动调用这个工厂函数创建该键并分配给它一个默认值。
示例 1:计数
假设我们需要计数列表中各元素的出现次数。
from collections import defaultdict
fruits = ['apple', 'banana', 'orange', 'apple', 'banana', 'apple']
fruit_counter = defaultdict(int) # int() 函数返回 0
for fruit in fruits:
fruit_counter[fruit] += 1
print(fruit_counter)
在这里,我们创建了一个 defaultdict
并将 int
作为默认工厂函数,所以任何新键的初始值都将是 0。
示例 2:组织数据到列表中
假设我们想将数据按照某个条件分类,然后储存在列表中。
from collections import defaultdict
surnames = [
('Smith', 'John'),
('Doe', 'Jane'),
('Smith', 'Will'),
('Black', 'Eva'),
]
surname_dict = defaultdict(list) # list() 函数返回空列表 []
for surname, name in surnames:
surname_dict[surname].append(name)
print(surname_dict)
这里,我们将 list
作为 defaultdict
的默认工厂函数,因此任何新键都将自动被初始化为空列表,方便我们追加元素。
总结
通过使用 defaultdict
来避免手动检查字典中键的存在,我们可以编写出更加简洁和高效的代码。它特别适用于需要聚合或分类数据的情况,比如计数、分组等。这是一个简单而强大的工具,可以帮助你减少代码中的 if
检查和手动初始化值的操作。collections
模块中还有许多其他有趣的类,比如 Counter
、OrderedDict
和 namedtuple
,这些都是扩展和加强 Python 标准字典和元组功能的有用工具。