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
,我们可以轻松地处理多层级的数据结构,而不需要手动创建每个层级的默认值。这在处理嵌套数据或构建多层字典时非常有用。