您的位置:

Python defaultdict:提升字典性能和易用性的利器

一、Python字典概述

在Python中,字典(dictionary)是一种非常常用的数据类型。它是一种可变容器模型,也是一种无序的键(key)和值(value)的对应关系,通过键可以快速地查到对应的值。Python字典的特点是:无序、可变、键唯一。

字典是Python中内置的一种数据结构,可以通过{}表示,其中键值对之间用冒号(:)隔开,每个键值对之间用逗号(,)隔开。

{
    Key1: Value1,
    Key2: Value2,
    Key3: Value3,
    ...
}

下面是一个简单的Python字典示例:

person = {
    'name': 'Tom',
    'age': 18,
    'gender': 'male'
}

如上所示,可以通过这种方式快速定义一个字典,其中三对键值分别是'name'、'age'和'gender'。可以通过键来获取其对应的值,例如:

print(person['name'])    # 输出'Tom'

通过上述代码可以看到,打印出了键'name'所对应的值'Tom'。

二、Python defaultdict的概述

Python的collections模块提供了defaultdict类,它是字典的一个子类,具有与普通字典相同的方法,但是可以为字典的任何不存在的键提供默认值。

默认值可以通过创建defaultdict对象时指定,并且所有键的默认值默认都是None。

defaultdict类是Python字典的扩展,它提供了一种更加优雅和易于使用的方法,她比Python字典更加高效,因为它没有在字典中添加缺失的键,而是直接在内部实现中使用默认值。

通过使用defaultdict类可以提高程序的可读性和性能。

三、Python defaultdict的用法

使用defaultdict可以在字典中查找不存在的键时返回一个默认值。可以通过创建defaultdict对象来指定所有键的默认值,例如:

from collections import defaultdict
nums = [1, 2, 3, 4, 5, 2, 3, 4, 5, 6]
d = defaultdict(int) # 所有键默认值为0
for num in nums:
    d[num] += 1
print(d)

上述示例中,使用了defaultdict来实现对nums序列中每个元素的计数。通过创建defaultdict(int)类实例,它默认将字典中不存在的键的值返回0,使用d[num] += 1代码实现计数。最后打印出得到的字典结果:

defaultdict(
   , {1: 1, 2: 2, 3: 2, 4: 2, 5: 2, 6: 1})
   

我们可以省略在字典中添加不存在键的步骤,这一过程可以交给defaultdict自动完成。

四、Python defaultdict的实战应用

下面我们将介绍一些实际应用场景中的Python defaultdict的用法。

1. 嵌套字典(Nested Dictionary)

在Python字典中,如果键本身又是另一个字典,我们就称其为嵌套字典。我们可以通过使用defaultdict来处理对于不存在的键访问,可以使得代码更加简洁和高效。

from collections import defaultdict
# 用来初始化默认字典
def default_factory():
    return [0, defaultdict(int)]
nested_dict = defaultdict(default_factory)
nested_dict['a'][1]['b'] = 1
print(datetime_dict)

上述示例中,可以看到首先我们定义一个名为default_factory的函数,用于初始化默认字典。在程序的后续操作中,我们通过default_factory指定每个键的默认值,可以看到这里我们使用了一个长度为2的列表,第一个元素是数字0,第二个元素是defaultdict(int)。

在示例中,我们对nested_dict['a'][1]['b']赋值为1,如果这个键不存在,那么它会被默认初始化为0和一个空的字典,这里的[1]是指index为1的元素,也就是嵌套字典中的第二个。

最终输出的结果如下:

defaultdict(
   , {'a': [0, defaultdict(
    , {'b': 1})]})
    
   

2. 使用lambda表达式设置默认值

除了可以使用defaultdict来指定默认值,还可以使用lambda表达式来设置默认值。可以看下面的一个简单的例子:

from collections import defaultdict
d = defaultdict(lambda:'None')
d['a'] = 'This is a'
d['b'] = 'This is b'
print(d['a'])     # 输出'This is a'
print(d['b'])     # 输出'This is b'
print(d['c'])     # 输出'None'

在上述示例中,我们使用了lambda表达式设置值的默认值,使用d['a'] = 'This is a'和d['b'] = 'This is b'来设置字典的值,如果字典中不存在对应的键的值,就会返回'None'。

3. 统计每个单词的频率

下面是一个更加实际的应用场景,用Python defaultdict来统计一个英文文本中每个单词出现的频率。

import re
from collections import defaultdict
filename = 'input.txt'
words_freq = defaultdict(int)
with open(filename) as f:
    for line in f:
        words = re.findall('\w+', line)
        for word in words:
            words_freq[word] += 1
print(words_freq)

此处,我们使用了Python内置的re模块,通过正则表达式来提取输入文本中的单词,使用defaultdict(int)来初始化一个字典,将每个单词作为键,它们在文中出现的次数作为值。

最后,我们通过打印 words_freq 字典,得到如下所示的结果:

defaultdict(
   , {'hello': 2, 'world': 2, 'python': 3, 'is': 2, 'awesome': 1})
   

4. 初始化有向图

下面是一个实际应用场景的示例:通过使用Python defaultdict来初始化一个有向图。

from collections import defaultdict
graph = defaultdict(list)
graph['A'].append('B')
graph['A'].append('C')
graph['B'].append('D')
graph['C'].append('D')
graph['D'].append('E')
graph['E'].append('F')
print(graph)

上述代码中,我们使用defaultdict(list)初始化一个空字典,将每个键的值初始化为一个空列表。在代码的后续操作中,我们使用append方法来将每个节点相邻的节点添加到列表中。

在上述示例中,可以看到我们初始化了有向图中6个节点,分别是'A'、'B'、'C'、'D'、'E'和'F'。最终输出的结果如下:

defaultdict(
   , {'A': ['B', 'C'], 'B': ['D'], 'C': ['D'], 'D': ['E'], 'E': ['F']})
   

五、总结

Python defaultdict是Python中重要的一个数据结构工具,它提供了一种非常高效和易于使用的方法来处理字典为空时出现的关键错误。使用Python defaultdict可以提高代码的可读性,并且具有更好的性能。在实际的编程过程中,可以灵活使用Python defaultdict来提高程序的效率和性能。