【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())

            详细解释:

    1. defaultdict(list):使用 collections.defaultdict 创建一个默认值为空列表的字典,用于存储排序后的字符串和对应的字母异位词。

    2. sorted(s):将字符串 s 的字母进行排序,比如 "eat" 排序后变成 "aet",这个排序后的字符串可以作为字母异位词的唯一标识。

    3. anagrams[sorted_str].append(s):如果 sorted_str 已经在字典中,则将原始字符串 s 添加到对应的列表中;否则,创建新的键值对。

    4. 最后,返回字典中所有值组成的列表,这就是按照字母异位词分组的结果。

    总结

  • defaultdict(list) 可以看作是一个带有默认值的字典,当访问不存在的键时,它会自动为该键创建一个空列表。
  • 使用 defaultdict(list) 可以避免繁琐的条件检查,使代码更加简洁和易于维护。
  • 作者:KiAiMi

    物联沃分享整理
    物联沃-IOTWORD物联网 » 【python】详解defaultdict字典用法(原创)

    发表回复