【python】详解defaultdict字典用法(原创)
defaultdict 一词为拼接词,由“default(默认)”与“dict(字典)”组合而成。
1. 基本用法
defaultdict
是python官方自带的一种特殊字典类型,允许我们为字典中的键提供一个默认值。与普通的 dict
不同,在使用 defaultdict
时,如果访问的键不存在,它会自动创建该键并将默认值赋给它。这在某些场景下非常方便,尤其是处理集合或列表时,无需手动检查键是否存在。
from collections import defaultdict
defaultdict
是 Python 中 dict
的一个子类,它的行为与普通字典类似,但有一个区别:如果你访问的键不存在,它不会抛出 KeyError
错误,而是会自动为这个键生成一个默认值。
2. 举例说明
下文举例都以列表作为默认值。
2.1 使用普通字典的情况
当我们使用普通字典时必须先检查字典中是否已有该键,否则会引发错误:
normal_dict = {}
# 尝试向不存在的键 'a' 中添加元素
if 'a' not in normal_dict:
normal_dict['a'] = []
normal_dict['a'].append(1)
print(normal_dict) # 输出: {'a': [1]}
在普通字典中,我们需要手动检查 'a'
键是否存在,如果不存在,需要初始化一个空列表。这个过程是繁琐的。
2.2 使用 defaultdict(list)
的情况
使用 defaultdict(list)
可以避免这种手动初始化的操作:
from collections import defaultdict
# 创建一个默认值为列表的 defaultdict
default_dict = defaultdict(list)
# 向键 'a' 中添加元素
default_dict['a'].append(1)
print(default_dict) # 输出: {'a': [1]}
在这里,当我们第一次访问 default_dict['a']
时,字典会自动创建一个空列表 []
,然后我们就可以直接向其中添加元素,而无需手动初始化。
3. 如何运作
defaultdict(list)
的工作原理是:当我们使用 defaultdict(list)
创建字典时,它会将 list
函数(即生成空列表的函数)作为“工厂函数”传递给字典。当字典发现某个键不存在时,它会调用这个“工厂函数”生成默认值。
在这个例子中,list()
被调用以生成空列表 []
,并将其作为缺失键的默认值。
4. 优点
KeyError
错误。5. 使用场景
在许多情况下,使用 defaultdict(list)
可以大大简化代码。例如:
defaultdict(list)
非常适合。6. 一个实际示例(Leetcode 49. 字母异位词分组)
题目描述:
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的所有字母得到的一个新单词。
示例 1:
输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
示例 2:
输入: strs = [""]
输出: [[""]]
示例 3:
输入: strs = ["a"]
输出: [["a"]]
解答:
class Solution:
def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
# 使用 defaultdict 处理默认的空列表
anagrams = defaultdict(list)
# 遍历每个字符串
for s in strs:
# 将字符串排序后作为字典的键
sorted_str = ''.join(sorted(s))
# 将原字符串加入到排序后键对应的列表中
anagrams[sorted_str].append(s)
# 返回字典中所有值组成的列表
return list(anagrams.values())
详细解释:
-
defaultdict(list)
:使用collections.defaultdict
创建一个默认值为空列表的字典,用于存储排序后的字符串和对应的字母异位词。 -
sorted(s)
:将字符串s
的字母进行排序,比如"eat"
排序后变成"aet"
,这个排序后的字符串可以作为字母异位词的唯一标识。 -
anagrams[sorted_str].append(s)
:如果sorted_str
已经在字典中,则将原始字符串s
添加到对应的列表中;否则,创建新的键值对。 -
最后,返回字典中所有值组成的列表,这就是按照字母异位词分组的结果。
总结
defaultdict(list)
可以看作是一个带有默认值的字典,当访问不存在的键时,它会自动为该键创建一个空列表。defaultdict(list)
可以避免繁琐的条件检查,使代码更加简洁和易于维护。作者:KiAiMi