Python 中的 defaultdict 与普通字典 dict:对比与实践

server/2024/11/13 5:34:55/

Python 中的 defaultdict 与普通字典 dict:对比与实践



文章目录

  • Python 中的 defaultdict 与普通字典 dict:对比与实践
    • 什么是字典?
    • 普通字典 (dict)
      • 创建方式
      • 访问不存在的键
      • 特点
      • 实例:统计词频
    • defaultdict
      • 创建方式
      • 访问不存在的键
      • 特点
      • 实例:统计词频
    • defaultdict 与普通字典的对比
      • 1. 键不存在时的行为
      • 2. 初始化和维护成本
      • 3. 代码简洁性
      • 4. 性能考量
    • 选择哪种字典类型
    • 结论


Python 中提供了多种数据结构来存储键值对,其中两种最常见的类型是普通的 dictcollections 模块中的 defaultdict。本文将详细介绍这两种字典类型的差异,并通过示例演示它们的使用方法。

什么是字典?

字典是 Python 中的一种内置容器类型,用于存储键值对。键必须是不可变的对象(如字符串、数字或元组),而值可以是任意类型的数据。字典提供了快速的查找功能,因为它们是基于哈希表实现的。

普通字典 (dict)

创建方式

普通的字典可以通过花括号 {} 来创建,也可以通过 dict() 函数来创建。

python"># 创建一个空字典
d = {}# 创建一个包含键值对的字典
d = {'apple': 1, 'banana': 2}# 通过 dict() 函数创建
d = dict(apple=1, banana=2)

访问不存在的键

访问一个不存在的键会导致 KeyError 异常。

python"># 创建一个普通字典
d = {'apple': 1, 'banana': 2}# 尝试访问一个不存在的键
try:print(d['nonexistent_key'])
except KeyError:print("Key does not exist!")

特点

  • 键不存在时的行为:抛出 KeyError 异常。
  • 初始化和维护成本:无需指定工厂函数,访问不存在的键时需要显式检查键的存在性。
  • 代码简洁性:需要更多的错误处理代码来处理键不存在的情况。
  • 性能考量:访问不存在的键时立即抛出异常,性能上相对更快,除非需要频繁处理异常。

实例:统计词频

使用普通字典来统计一段文本中各单词出现的次数。

python">def count_words(text):word_counts = {}for word in text.split():if word not in word_counts:word_counts[word] = 0word_counts[word] += 1return word_countstext = "hello world hello"
result = count_words(text)
print(result)  # 输出: {'hello': 2, 'world': 1}

defaultdict

defaultdictcollections 模块中的一种特殊字典类型,它允许你在访问不存在的键时返回一个默认值,而不是抛出 KeyError 异常。

创建方式

defaultdict 通过传入一个工厂函数(factory function)来创建。工厂函数是一个返回默认值的函数,例如 int, list, set, dict 等。

python">from collections import defaultdict# 创建一个默认值为 int 的 defaultdict
dd = defaultdict(int)# 创建一个默认值为空列表的 defaultdict
dd_list = defaultdict(list)# 创建一个默认值为空集合的 defaultdict
dd_set = defaultdict(set)# 创建一个默认值为空字典的 defaultdict
dd_dict = defaultdict(dict)# 访问不存在的键
print(dd['new_key'])       # 输出: 0
print(dd_list['new_key'])  # 输出: []
print(dd_set['new_key'])   # 输出: set()
print(dd_dict['new_key'])  # 输出: {}

访问不存在的键

当你尝试访问 defaultdict 中不存在的键时,它不会抛出 KeyError 异常,而是会根据工厂函数返回一个默认值。

python"># 创建一个默认值为 0 的 defaultdict
dd = defaultdict(int)# 访问一个不存在的键
print(dd['nonexistent_key'])  # 输出: 0

特点

  • 键不存在时的行为:不会抛出异常,而是返回默认值。
  • 初始化和维护成本:在创建时需要指定工厂函数,访问不存在的键时会调用该函数。
  • 代码简洁性:可以简化代码逻辑,避免频繁检查键的存在性。
  • 性能考量:在访问不存在的键时需要调用工厂函数,会有一定的性能开销。

实例:统计词频

使用 defaultdict 来统计一段文本中各单词出现的次数。

python">from collections import defaultdictdef count_words(text):word_counts = defaultdict(int)for word in text.split():word_counts[word] += 1return word_countstext = "hello world hello"
result = count_words(text)
print(result)  # 输出: {'hello': 2, 'world': 1}

defaultdict 与普通字典的对比

1. 键不存在时的行为

  • defaultdict:不会抛出异常,而是返回默认值。
  • 普通字典:抛出 KeyError 异常。

2. 初始化和维护成本

  • defaultdict:在创建时需要指定工厂函数,访问不存在的键时会调用该函数。
  • 普通字典:不需要指定工厂函数,访问不存在的键时需要显式检查键的存在性。

3. 代码简洁性

  • defaultdict:可以简化代码逻辑,避免频繁检查键的存在性。
  • 普通字典:需要更多的错误处理代码来处理键不存在的情况。

4. 性能考量

  • defaultdict:在访问不存在的键时需要调用工厂函数,会有一定的性能开销。
  • 普通字典:访问不存在的键时立即抛出异常,性能上相对更快,除非需要频繁处理异常。

选择哪种字典类型

  • 使用 defaultdict:当你需要频繁地访问不存在的键,并且希望返回一个默认值时,使用 defaultdict 更合适。
  • 使用普通 dict:当你确信键都已存在,或者希望在键不存在时立即抛出异常时,使用普通 dict 更好。

结论

defaultdict 和普通 dict 各有优势,选择哪一种取决于你的具体需求。如果你需要处理不存在的键并且希望简化代码,defaultdict 是更好的选择。如果你关心性能并且确信键都已存在,普通 dict 可能更合适。


http://www.ppmy.cn/server/103707.html

相关文章

安装MySQL入门基础指令

一.安装MySQL(以5.7版本为例) 1.一路默认安装,截图供大家参考 修改自己window安装名字即可 2.配置环境变量 C:\Program Files\MySQL\MySQL Server 5.7\bin 写入系统环境变量即可在window窗口使用其服务了 3.登录MySQL服务 进入控制台输入命令 mysql -u root …

Metasploit漏洞利用系列(五):MSF渗透测试 - 应用Word软件渗透实战

在本系列的第五篇文章中,我们将探索如何利用Metasploit Framework (MSF) 针对Microsoft Word这一广泛使用的办公软件进行渗透测试。由于Word文档在企业和个人间的频繁交换,它们成为了网络攻击者植入恶意代码的理想载体。本文将通过一个具体的案例&#x…

esbuild中的Base64 Loader:轻松将文件编码为Base64字符串并嵌入代码

在前端或Node.js项目中,有时我们需要将文件内容作为字符串嵌入到代码中,以便在运行时能够方便地访问。为了实现这一需求,esbuild提供了Base64 Loader这一功能强大的工具。它能够在构建时将文件加载为二进制缓冲区,并使用Base64编码…

哈希原理实现

本节主要看源代码实现 哈希特点 哈希(Hashing)是一种将数据映射到固定大小的表中以实现快速查找的数据结构和算法方法。哈希的主要特点包括: 1. 高效的查找、插入和删除 时间复杂度:哈希表通常提供近乎常数时间的查找、插入和…

中国植物性状数据库

中国植物性状的研究主要集中在植物的生理结构和功能,‌以及它们对环境的适应性上。‌中国植物性状的多样性体现在多个方面,‌包括植物的生理结构、‌生长习性、‌以及对环境的适应性等。 中国植物性状数据库,包含了来自140个样点的1529种植物…

Educational Codeforces Round 169 (Rated for Div. 2) ABCD+E补

A题:Closest Point 题意 给定若干不同的点,问是否存在一个与这些点不同的点,使得其是对于它们之中的每一点最近 思路 A题不会有很大的难度,我们正常想,如果出现三个点的话,就无法再添加点使得它是全体最…

djnago之序列化器的用法

Django 的序列化器(Serializers)是 Django REST framework(DRF)中的一个核心组件,用于将复杂的数据类型(如 Django 模型实例)转换为 JSON、XML 或其他内容类型,反之亦然。序列化器不…

Android MVVM框架详解与应用

在Android开发中,随着应用复杂度的增加,如何有效地组织和管理代码成为了一个重要的问题。MVVM(Model-View-ViewModel)架构模式因其清晰的结构和高效的开发效率,逐渐成为Android开发者们青睐的架构模式之一。本文将详细…