defaultdict详解

defaultdict详解

  • 今天在看博文的时候,无意间看到了defaultdic的用法,觉得挺有意思的,分享下

  • defaultdict是一个字典(dict)的子类,它提供了一种更方便的方式来处理缺失键(key)的情况。与普通的字典不同,defaultdict在初始化时需要指定一个默认工厂函数(default factory function),该函数用于提供缺失键的默认值。

  • 下面是defaultdict的基本用法示例:

from collections import defaultdict

# 定义一个默认工厂函数,返回默认值为0的整数
def default_factory():
    return 0

# 创建一个defaultdict对象,并指定默认工厂函数
my_dict = defaultdict(default_factory)

# 使用defaultdict对象
my_dict['apple'] = 1
my_dict['banana'] = 2

print(my_dict['apple'])     # 输出: 1
print(my_dict['banana'])    # 输出: 2
print(my_dict['orange'])    # 输出: 0(缺失的键返回默认值0)



#当然,我们在统计元素的个数时也可以这样用
from collections import defaultdict
words= ('a', 'b', 'c', 'a','a', 'a', 'b', 'd')
counts = defaultdict(lambda: 0) #不存在就默认为1
for word in words:
    counts[word ] += 1 #存在就+1


在上面的例子中,我们首先定义了一个默认工厂函数default_factory,它返回默认值为0的整数。然后,我们创建了一个defaultdict对象my_dict,并将默认工厂函数传递给它。接下来,我们像使用普通字典一样操作my_dict,将一些键值对存储其中。

当我们访问已存在的键(例如'apple''banana')时,defaultdict的行为与普通字典相同,返回键对应的值。然而,当我们访问不存在的键(例如'orange')时,defaultdict会自动调用默认工厂函数,并返回默认值0。

使用defaultdict的好处是,它可以简化代码,避免了在访问缺失键时手动处理KeyError异常或编写额外的判断逻辑来设置默认值。默认工厂函数可以根据需要返回不同类型的默认值,例如空列表、空集合等。

需要注意的是,在使用defaultdict时,如果在构建字典时没有指定默认工厂函数,则会引发TypeError。因此,务必在创建defaultdict对象时指定一个有效的默认工厂函数。

再例如
给定的代码创建了一个嵌套的 defaultdict 对象 survey_data,该对象的值是一个 defaultdict 对象。

defaultdict 使用 lambda 函数作为默认工厂函数,以创建默认值为 defaultdict(list) 的字典。

defaultdict(list) 是一个默认值为列表的字典。它的作用是在访问不存在的键时,自动创建一个空列表作为默认值。

下面是一个示例,展示了如何使用 survey_data 对象:

from collections import defaultdict

survey_data = defaultdict(lambda: defaultdict(list))

# 添加数据
survey_data["person1"]["name"].append("John")
survey_data["person1"]["age"].append(25)
survey_data["person2"]["name"].append("Jane")
survey_data["person2"]["age"].append(30)

# 打印 survey_data
print(survey_data)

输出结果如下所示:

defaultdict(<function <lambda> at 0x000001234567890>, {
    'person1': defaultdict(<class 'list'>, {'name': ['John'], 'age': [25]}),
    'person2': defaultdict(<class 'list'>, {'name': ['Jane'], 'age': [30]})
})

在这个示例中,我们使用 survey_data 对象来存储调查数据。我们通过对字典的键进行索引和赋值的方式,向其中添加了两个人的数据。

survey_data["person1"] 返回了一个默认值为 defaultdict(list) 的字典对象。然后,我们可以使用类似字典的方式,通过键 "name""age" 访问 person1 的数据,并将相应的值添加到列表中。

同样地,我们也可以为其他人(例如 person2)添加数据,以及对应的名称和年龄。

通过使用嵌套的 defaultdict,我们可以轻松地处理多层级的数据结构,而不需要手动创建每个层级的默认值。这在处理嵌套数据或构建多层字典时非常有用。

posted @ 2023-06-27 09:51  小杨的冥想课  阅读(451)  评论(0编辑  收藏  举报