欢迎访问宙启技术站
智能推送

Python中的defaultdict()详解:处理字典中键不存在的情况

发布时间:2023-12-24 15:54:27

在Python中,defaultdict是collections模块中的一个类,它是字典类的一个子类,可以在字典中处理键不存在的情况。defaultdict接受一个工厂函数作为参数,用于提供默认值,当访问一个不存在的键时,将使用工厂函数提供的默认值。

下面是defaultdict类的构造函数定义:

defaultdict([default_factory[,...]]) 

其中,default_factory是可调用的对象,用于提供默认值。当没有提供default_factory参数时,default_factory默认为None,访问不存在的键将会抛出KeyError异常。

想要使用defaultdict,首先需要导入collections模块:

from collections import defaultdict

接下来,我们来看一个例子来理解defaultdict的用法。

假设我们想要统计一篇文章中每个字母的出现次数,我们可以使用一个字典来存储每个字母和其对应的出现次数。但是,如果我们直接访问一个不存在的字母键,会抛出KeyError异常。这时,我们可以使用defaultdict来解决这个问题。

from collections import defaultdict

# 创建一个默认值为0的defaultdict
letter_counts = defaultdict(int)

# 统计字母出现的次数
text = "Hello, world!"
for letter in text:
    letter_counts[letter] += 1

# 打印结果
for letter, count in letter_counts.items():
    print(letter, ": ", count)

运行上述代码,输出结果如下:

H :  1
e :  1
l :  3
o :  2
, :  1
  :  1
w :  1
r :  1
d :  1
! :  1

在上述例子中,我们创建了一个默认值为0的defaultdict对象,用于存储字母和其对应的出现次数。在遍历文章中的字母时,我们可以直接使用letter_counts[letter] += 1进行计数,即使letter是一个之前没有出现过的字母,也不会抛出KeyError异常。

此外,defaultdict还可以接受其他各种可调用的对象作为默认值。比如,我们想要统计一个列表中每个元素出现的次数,我们可以使用int类型的默认值,也可以使用list类型的默认值。

from collections import defaultdict

# 创建一个默认值为int类型的defaultdict,用于统计元素出现次数
element_counts = defaultdict(int)

# 创建一个默认值为list类型的defaultdict,用于存储元素的出现位置
element_positions = defaultdict(list)

# 统计元素出现的次数和位置
elements = [1, 2, 3, 1, 2, 3, 1, 2, 3]
for i, element in enumerate(elements):
    element_counts[element] += 1
    element_positions[element].append(i)

# 打印结果
for element, count in element_counts.items():
    print(element, ": ", count)
    
for element, positions in element_positions.items():
    print(element, ": ", positions)

运行上述代码,输出结果如下:

1 :  3
2 :  3
3 :  3
1 :  [0, 3, 6]
2 :  [1, 4, 7]
3 :  [2, 5, 8]

在上述例子中,我们创建了两个defaultdict对象,一个用于统计元素出现的次数,另一个用于存储元素的出现位置。我们使用enumerate函数来同时获取元素的索引和值,然后使用defaultdict来统计元素出现的次数和位置。最后,我们输出结果进行验证。

总结:

通过使用defaultdict,我们可以简化代码,并且不再需要在访问一个不存在的键时手动进行键的判断和更新。defaultdict会自动使用工厂函数提供的默认值。这提供了一个方便且高效的方式来处理字典中键不存在的情况。