如何在 Python 中使用 collections.defaultdict

PythonPythonBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在本教程中,我们将探索Python中的 collections.defaultdict,这是一种强大的数据结构,可简化对缺失键的处理。到最后,你将了解如何利用这个多功能工具来简化你的Python编程任务。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL python(("Python")) -.-> python/DataStructuresGroup(["Data Structures"]) python(("Python")) -.-> python/PythonStandardLibraryGroup(["Python Standard Library"]) python/DataStructuresGroup -.-> python/dictionaries("Dictionaries") python/PythonStandardLibraryGroup -.-> python/data_collections("Data Collections") python/PythonStandardLibraryGroup -.-> python/data_serialization("Data Serialization") subgraph Lab Skills python/dictionaries -.-> lab-398273{{"如何在 Python 中使用 collections.defaultdict"}} python/data_collections -.-> lab-398273{{"如何在 Python 中使用 collections.defaultdict"}} python/data_serialization -.-> lab-398273{{"如何在 Python 中使用 collections.defaultdict"}} end

collections.defaultdict 简介

collections.defaultdict 是Python内置 dict 类的一个子类。它提供了一种创建类似字典对象的方式,该对象会使用默认值自动初始化新键,而不是在访问不存在的键时引发 KeyError

当你需要对字典中可能尚不存在的键执行操作时,defaultdict 特别有用,因为它使你无需进行显式检查和初始化。

什么是 defaultdict

defaultdict 是一个类似字典的对象,它为缺失的键提供默认值。当你尝试访问 defaultdict 中不存在的键时,它会自动使用默认值创建一个新条目,而不是引发 KeyError

默认值在创建 defaultdict 对象时指定,它可以是任何有效的Python对象,例如数字、列表、函数,甚至是另一个 defaultdict

创建 defaultdict

要创建一个 defaultdict,你可以使用 collections 模块中的 defaultdict() 函数。该函数接受一个参数,即用于初始化新键的默认工厂函数。

from collections import defaultdict

## 创建一个默认值为 0 的 defaultdict
dd = defaultdict(int)

在上面的示例中,我们创建了一个 defaultdict,其默认工厂函数为 int,这意味着任何新键都将初始化为值 0

defaultdict 中访问和修改值

创建 defaultdict 后,你可以像普通字典一样访问和修改其值:

## 访问一个不存在的键
print(dd['new_key'])  ## 输出:0

## 修改一个现有键
dd['new_key'] += 1
print(dd['new_key'])  ## 输出:1

## 添加一个新的键值对
dd['another_key'] = 42
print(dd)  ## 输出:defaultdict(<class 'int'>, {'new_key': 1, 'another_key': 42})

在上面的示例中,我们首先访问 defaultdict 中不存在的键,它会自动使用默认值 0 创建一个新条目。然后我们修改 'new_key' 键的值,并向 defaultdict 中添加一个新的键值对。

collections.defaultdict 的用例

collections.defaultdict 是一个多功能工具,可用于Python中各种需要处理字典的情况。以下是 defaultdict 的一些常见用例:

统计出现次数

defaultdict 最常见的用例之一是统计序列中元素的出现次数,例如文本中的单词或字符串中的字符。通过使用默认工厂函数为 intdefaultdict,你可以轻松跟踪每个元素的计数,而无需检查键是否已经存在。

from collections import defaultdict

## 统计句子中单词的出现次数
sentence = "The quick brown fox jumps over the lazy dog"
word_count = defaultdict(int)
for word in sentence.split():
    word_count[word] += 1

print(dict(word_count))
## 输出: {'The': 1, 'quick': 1, 'brown': 1, 'fox': 1, 'jumps': 1, 'over': 1, 'the': 1, 'lazy': 1, 'dog': 1}

数据分组

defaultdict 的另一个常见用例是根据某个键对数据进行分组。通过使用返回新列表或集合的默认工厂函数的 defaultdict,你可以轻松地将元素分组在一起,而无需手动初始化列表或集合。

from collections import defaultdict

## 按首字母对单词进行分组
words = ['apple', 'banana', 'cherry', 'date', 'elderberry']
word_groups = defaultdict(list)
for word in words:
    word_groups[word[0]].append(word)

print(dict(word_groups))
## 输出: {'a': ['apple'], 'b': ['banana'], 'c': ['cherry'], 'd': ['date'], 'e': ['elderberry']}

处理嵌套结构

在处理嵌套数据结构时,例如字典的字典或字典的列表,defaultdict 也很有用。通过使用返回另一个 defaultdict 或列表的默认工厂函数的 defaultdict,你可以轻松创建和管理这些嵌套结构,而无需担心初始化中间值。

from collections import defaultdict

## 创建一个嵌套字典来存储用户信息
user_info = defaultdict(lambda: defaultdict(str))
user_info['Alice']['age'] = 30
user_info['Alice']['email'] = '[email protected]'
user_info['Bob']['age'] = 35
user_info['Bob']['email'] = '[email protected]'

print(dict(user_info))
## 输出: {'Alice': {'age': 30, 'email': '[email protected]'}, 'Bob': {'age': 35, 'email': '[email protected]'}}

这些只是 collections.defaultdict 众多用例中的几个示例。通过了解它的工作原理以及它可以帮助解决的问题类型,你可以利用这个强大的工具来简化你的Python代码并提高其效率。

动手实践 collections.defaultdict

既然你已经对 collections.defaultdict 是什么以及如何使用它有了基本的了解,那我们就深入一些实际例子来巩固你的知识。

示例1:统计单词频率

假设你有一个包含大量文本的文本文件,并且你想统计文件中每个单词的出现频率。你可以使用 defaultdict 使这项任务变得容易得多。

from collections import defaultdict

## 打开文本文件
with open('text.txt', 'r') as file:
    text = file.read().lower().split()

## 创建一个defaultdict来存储单词频率
word_freq = defaultdict(int)

## 统计每个单词的频率
for word in text:
    word_freq[word] += 1

## 打印出现频率最高的前10个单词
top_words = sorted(word_freq.items(), key=lambda x: x[1], reverse=True)[:10]
for word, count in top_words:
    print(f"{word}: {count}")

在这个例子中,我们首先打开一个文本文件并读取其内容。然后我们创建一个默认工厂函数为 intdefaultdict 来存储单词频率。我们遍历文本中的单词,并在 defaultdict 中为每个单词的计数加1。最后,我们按计数值对 defaultdict 进行排序,并打印出现频率最高的前10个单词。

示例2:按多个键对数据进行分组

假设你有一个表示学生信息的元组列表,并且你想按年级和班级对学生进行分组。你可以使用嵌套的 defaultdict 来完成这项任务。

from collections import defaultdict

## 学生信息
students = [
    ('Alice', 'A', 'Math'),
    ('Bob', 'B', 'Math'),
    ('Charlie', 'A', 'English'),
    ('David', 'B', 'English'),
    ('Eve', 'A', 'Math'),
    ('Frank', 'B', 'English')
]

## 创建一个嵌套的defaultdict来对学生进行分组
student_groups = defaultdict(lambda: defaultdict(list))

## 按年级和班级对学生进行分组
for name, grade, subject in students:
    student_groups[grade][subject].append(name)

## 打印分组后的学生信息
for grade, class_groups in student_groups.items():
    print(f"Grade {grade}:")
    for subject, student_names in class_groups.items():
        print(f"  {subject}: {', '.join(student_names)}")

在这个例子中,我们创建了一个嵌套的 defaultdict,其默认工厂函数返回另一个默认工厂函数返回列表的 defaultdict。然后我们遍历学生信息,并根据他们的年级和科目将每个学生添加到相应的组中。最后,我们打印分组后的学生信息。

这些示例应该为你在自己的Python项目中使用 collections.defaultdict 提供一个良好的起点。请记住,有效使用 defaultdict 的关键在于理解它可以帮助解决的问题类型,以及如何利用其独特功能来简化你的代码并提高其效率。

总结

Python 中的 collections.defaultdict 是该语言内置数据结构的一个重要补充。通过为缺失的键提供默认值,它可以帮助你编写更简洁、更健壮的代码。无论你是从事数据处理、网页开发还是任何其他基于 Python 的项目,本教程都将为你提供有效使用 collections.defaultdict 的知识,并提升你的 Python 编程技能。