python 进阶之collections中的defaultdict

1. 前言

Python是一门非常流行的编程语言,也因此其社区非常庞大而且发达。在Python标准库中,有一个叫做collections的模块,提供了一系列的数据类型,比如OrderedDict、Counter等等。本文将关注其中的defaultdict。

2. defaultdict基本概念

Python的内置类型dict是极其常用的一种数据类型。但是,如果我们需要为一个不存在于字典中的键提供一个默认值,我们该如何处理呢?传统的做法可能是使用try和except语句块,但是这样会使代码显得非常冗长。此时,defaultdict就可以派上用场了。

defaultdict和内置的字典类型非常类似,唯一的区别是在于defaultdict的构造函数会接受一个工厂函数作为其第一个参数。当我们访问一个不存在的键时,工厂函数就会被调用,返回一个默认值。

2.1 defaultdict的使用方法

下面是一个简单的使用defaultdict的案例:

from collections import defaultdict

d = defaultdict(int)

d['one'] = 1

d['two'] = 2

print(d['one']) # 1

print(d['two']) # 2

print(d['three']) # 0

在上面的代码中,我们调用了defaultdict的构造函数,并传递了一个int类型的函数作为其参数。当字典中不存在键'three'时,int函数就会被调用并返回一个默认值0。

除了int,我们还可以传递list、set、dict等函数作为参数,来创建不同类型的defaultdict。下面是一个创建defaultdict(list)的案例:

from collections import defaultdict

d = defaultdict(list)

for k, v in [('a', 1), ('b', 2), ('a', 3)]:

d[k].append(v)

print(d)

在上面的代码中,我们创建了一个defaultdict(list)对象,然后在循环中往其中添加了一些元素。由于defaultdict(list)中的list函数会返回一个空列表,所以我们添加元素时不用担心其键是否存在。

2.2 defaultdict的常用应用场景

defaultdict是一个非常有用的数据类型,有许多应用场景,下面将介绍其中的几个:

2.2.1 统计字符出现的次数

下面是一个统计文件中各个字符出现次数的案例,代码如下:

from collections import defaultdict

def count_chars(filename):

result = defaultdict(int)

with open(filename, 'r') as f:

for line in f:

for char in line.strip():

result[char] += 1

return result

print(count_chars('test.txt'))

在上面的代码中,我们首先定义了一个名为count_chars的函数,该函数接受一个文件名作为其参数。在函数内部,我们使用了一个defaultdict(int)来创建一个计数器,遍历文件中的每一行,并逐个统计每个字符的出现次数。

2.2.2 分组

下面是一个将姓名按照首字母分组的案例,代码如下:

from collections import defaultdict

names = ['Alice', 'Bob', 'Aaron', 'Billy', 'Adrian']

result = defaultdict(list)

for name in names:

result[name[0]].append(name)

print(result)

在上面的代码中,我们定义了一个名为names的列表,其中包含了一些姓名。然后我们使用一个defaultdict(list)来创建一个字典,遍历names中的每个元素,并将其按照首字母分组。

2.2.3 构建有向图

下面是一个使用defaultdict构建有向图的案例,代码如下:

from collections import defaultdict

graph = defaultdict(list)

def add_edge(u, v):

graph[u].append(v)

add_edge(1, 2)

add_edge(1, 3)

add_edge(2, 3)

add_edge(3, 1)

print(graph)

在上面的代码中,我们定义了一个名为graph的defaultdict(list),用于表示有向图。然后我们定义了一个名为add_edge的函数,用于向图中添加边,最后往图中添加了一些边,并打印出了图的结构。

3. 总结

defaultdict是Python标准库中非常有用的一个数据类型。它可以用来避免繁琐的if-else语句块,让代码更加简洁明了。在本文中,我们介绍了defaultdict的基本概念和使用方法,并给出了一些常见的应用场景。

后端开发标签