📅  最后修改于: 2023-12-03 15:15:11.989000             🧑  作者: Mango
defaultdict
是Python中collections
模块中的一个类,它提供了一个可以使用默认值的dict
对象。它与普通的dict
的区别是,在正常字典没有某个键的时候,你访问它时将返回一个KeyError
错误,而在defaultdict
中,如果访问一个不存在的键时,会返回一个新的默认值。
在使用defaultdict
时,首先需要从collections
模块导入它,然后需要创建一个默认值工厂,以确定在字典中没有某个键时将返回什么值。最后创建一个defaultdict
对象。
默认值工厂可以是一个简单的数据类型,也可以是自定义函数,这个函数将在键不存在时被调用,并返回相应的默认值。
from collections import defaultdict
# 创建一个默认值工厂
default_val = 'N/A'
# 创建一个defaultdict对象
d = defaultdict(lambda: default_val)
d['A'] = 1
d['B'] = 2
# 访问一个存在的键
print(d['A']) # 1
# 访问一个不存在的键
print(d['C']) # N/A
在上面的例子中,我们创建了一个默认值工厂,将它传递给了一个defaultdict
对象。我们可以按照普通字典的方式往里面添加一些键值对。在访问一个存在的键时,将返回它对应的值;在访问一个不存在的键时,则返回默认值。
默认字典的运用场景非常广泛,特别是在处理字典时,它可以简化很多代码。下面是一些常见的应用场景。
在统计单词出现次数时,我们通常会考虑用字典来实现。但是在初始化字典时,如果不使用defaultdict
,我们需要先检查是否存在某个键,如果不存在,再给它赋初值,这样就非常麻烦。使用defaultdict
后,我们无需再做这些检查,直接添加元素即可。
from collections import defaultdict
text = '''Python is an interpreted, high-level, general-purpose programming language.
Created by Guido van Rossum and first released in 1991, Python's design philosophy
emphasizes code readability with its notable use of significant whitespace.'''
word_cnt = defaultdict(int) # 默认值为0,可简化代码
for word in text.split():
# 自增运算相当于word_cnt[word]=word_cnt[word]+1
word_cnt[word] += 1
print(word_cnt)
运行结果:
defaultdict(<class 'int'>, {'Python': 1, 'is': 1, 'an': 1, 'interpreted,': 1, 'high-level,': 1, 'general-purpose': 1, 'programming': 1, 'language.': 1, 'Created': 1, 'by': 1, 'Guido': 1, 'van': 1, 'Rossum': 1, 'and': 1, 'first': 1, 'released': 1, 'in': 2, '1991,': 1, "Python's": 1, 'design': 1, 'philosophy': 1, 'emphasizes': 1, 'code': 1, 'readability': 1, 'with': 1, 'its': 1, 'notable': 1, 'use': 1, 'of': 1, 'significant': 1, 'whitespace.': 1})
在上面的例子中,我们使用了defaultdict(int)
来创建了一个默认值为0的字典。接着,遍历文本中所有单词,使用自增操作将它们加入到字典中。最后打印出字典,即得到了每个单词的出现次数。
当处理JSON数据时,有时候会因为数据有缺失或者错误,导致我们无法直接使用某个键来访问数据,这时候就可以使用defaultdict
,为缺失的键提供一个合理的默认值。
from collections import defaultdict
import json
json_str = '{"name": "John", "age": 30, "city": "New York"}'
# 将JSON字符串转为Python字典
d = json.loads(json_str, object_hook=lambda d: defaultdict(str, d))
# 访问已存在的键
print(d['name']) # John
# 访问不存在的键,将返回默认值''
print(d['phone']) # ''
# 尝试将一个不存在的键赋值
d['phone'] = '123456'
print(json.dumps(d)) # 输出:{"name": "John", "age": 30, "city": "New York", "phone": "123456"}
在上面的例子中,我们使用json.loads()
函数将一个JSON字符串转为Python字典。由于JSON数据可能存在不存在的键,我们在转化时使用了一个自定义函数,将Python字典转为默认值为''的defaultdict
。这样一来,就可以在访问不存在的键时,得到合理的默认值。可以看到,我们尝试给一个不存在的键赋值,它就被成功地加入到了字典中。最后使用json.dumps()
函数将defaultdict
转为JSON字符串输出。