📜  from collections import defaultdict - Python (1)

📅  最后修改于: 2023-12-03 15:15:11.989000             🧑  作者: Mango

Python中的defaultdict

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数据

当处理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字符串输出。