Python defaultdict方法使用分析
在 Python 的 collections 模块中,提供了一个名为 defaultdict 的字典类,它是 Python 标准字典(dict)的子类,能够为字典提供一些额外的API和特殊的行为。在本文中,我们将讨论 defaultdict 是什么,以及它与标准字典的区别,在哪些场景下需要使用 defaultdict,以及它的用法和示例。
什么是 defaultdict
defaultdict 是 Python 内置的一个字典类,它继承了 dict 类型,和字典(dict)对象一样,支持所有的字典方法。但是 defaultdict 与 dict 有一个重要的区别:当所访问的key不存在的时候,defaultdict 会自动调用一个特殊的工厂函数来创建这个缺失的 key 对应的 value。
defaultdict的区别
当我们需要为字典中的值设置默认值的时候,通常的做法是先判断这个值是否存在,如果不存在则设置默认值,否则使用原本的值。这一过程需要写额外的代码,在 defaultdict 中,我们可以省去这些代码,从而更加简洁、方便的方式来操作字典中的默认值。
来看下面这个例子,我们需要按语言对学生进行分类:
students = [('Kim', 'Korean'), ('Alice', 'English'),
('Tom', 'English'), ('Jim', 'Korean'),
('Mike', 'English'), ('Andy', 'Korean')]
result = {}
for name, lang in students:
if lang not in result:
result[lang] = []
result[lang].append(name)
print(result)
# 输出: {'Korean': ['Kim', 'Jim', 'Andy'], 'English': ['Alice', 'Tom', 'Mike']}
我们每次迭代的时候,都需要首先检查当前语言是否存在字典中,如果不存在,则需要先添加一个空列表作为默认值,这导致代码显得繁琐。
但是如果使用 defaultdict,则可以省去这些代码,如下所示:
from collections import defaultdict
students = [('Kim', 'Korean'), ('Alice', 'English'),
('Tom', 'English'), ('Jim', 'Korean'),
('Mike', 'English'), ('Andy', 'Korean')]
result = defaultdict(list)
for name, lang in students:
result[lang].append(name)
print(result)
# 输出: defaultdict(<class 'list'>, {'Korean': ['Kim', 'Jim', 'Andy'], 'English': ['Alice', 'Tom', 'Mike']})
这个 defaultdict 类型是特殊的,在创建 defaultdict 对象时,可以传递一个函数作为参数。如果我们访问的字典键不存在,会根据这个函数返回一个默认值。
defaultdict的用法
为了更好的理解 defaultdict 的使用方法,我们来看看常用的 API。
defaultdict(default_factory)
- defaultdict 是一个类,并且继承了字典类(dict)。
- defaultdict 在初始化时,需要传递一个参数 default_factory,默认值是 None。default_factory 可以是一个可调用函数(callable),也可以是一个参数值,用于设置默认的 value 值。
- 当 key 不存在的时候,default_factory 就会被调用,来返回一个默认值,从而避免 KeyError 异常的出现。
from collections import defaultdict
# 定义一个函数,用于设定默认值
def default_value():
return 'N/A'
# 初始化 defaultdict
default_dict = defaultdict(default_value)
# 在访问不存在的键时将调用 default_value()
print(default_dict['k'])
# 输出: N/A
# 向字典中添加键值对
default_dict['name'] = 'Kim'
print(default_dict)
# 输出: defaultdict(<function default_value at 0x7feb9e61c158>, {'k': 'N/A', 'name': 'Kim'})
defaultdict其他API
在 defaultdict 中,除了前面所介绍的default_factory参数外,其余的 API 与字典(dict)是一样的。如下所示:
- defaultdict.copy() 方法来实现深度拷贝。
- defaultdict.update() 方法来对字典进行更新。
- defaultdict.pop() 方法用于删除字典中指定的键。
- defaultdict.clear() 方法用于清空字典中的所有元素。
defaultdict的示例
下面是一些 defaultdict 的示例,希望可以把使用技巧说得更加清晰。
defaultdict实现分组
from collections import defaultdict
# 定义源数据
raw_data = [
{'year': 2020, 'month': 1, 'day': 1, 'value': 111},
{'year': 2020, 'month': 1, 'day': 2, 'value': 112},
{'year': 2020, 'month': 1, 'day': 3, 'value': 113},
{'year': 2020, 'month': 2, 'day': 1, 'value': 121},
{'year': 2020, 'month': 2, 'day': 2, 'value': 122},
{'year': 2020, 'month': 3, 'day': 1, 'value': 131},
]
# 使用 defaultdict 对数据进行分组处理
result = defaultdict(list)
for item in raw_data:
year, month = item['year'], item['month']
key = f"{year}-{month}"
result[key].append(item)
print(result)
# 输出: defaultdict(<class 'list'>, {'2020-1': [{'year': 2020, 'month': 1, 'day': 1, 'value': 111}, {'year': 2020, 'month': 1, 'day': 2, 'value': 112}, {'year': 2020, 'month': 1, 'day': 3, 'value': 113}], '2020-2': [{'year': 2020, 'month': 2, 'day': 1, 'value': 121}, {'year': 2020, 'month': 2, 'day': 2, 'value': 122}], '2020-3': [{'year': 2020, 'month': 3, 'day': 1, 'value': 131}]})
defaultdict实现计数
from collections import defaultdict
# 定义源字符串
source_str = "abbcacddc"
# 遍历每个字符,使用 defaultdict 统计每个字符出现次数
count_dict = defaultdict(int)
for char in source_str:
count_dict[char] += 1
print(count_dict)
# 输出: defaultdict(<class 'int'>, {'a': 2, 'b': 2, 'c': 3, 'd': 2})
在这个示例中,我们首先定义了一个字符串 source_str,然后遍历其中的每个字符。使用 defaultdict 来统计每个字符出现的次数,最后得到的结果是一个字典,它的键是指定的字符,而值则是对应字符出现的次数。
总结
本文主要介绍了 defaultdict 处理字典时的用法和示例,对于那些需要快速处理字典或者需要使用默认值的场景,defaultdict 是一个不错的选择。如果你还不太熟悉如何使用 defaultdict,可以在实际项目中多使用,相信它将会为你省去不少代码量。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python defaultdict方法使用分析 - Python技术站