使用 Python 字典的一些高级方法

2024 年 08 月 29 日 | 阅读 9 分钟

在本教程中,我们将解释字典的一些重要且令人兴奋的用例。字典是最重要和最有用的数据结构,它存储键值对,并且灵活、高效且易于使用。尽管 Python 字典通常用于计数频率、映射值或组织数据等任务,但它们可以以各种富有创意和意想不到的方式使用。本文旨在深入探讨您可能尚未考虑到的 Python 字典的十种独特和非常规用途。让我们看看字典的一些激动人心的用法。

  • 记忆化
  • 稀疏矩阵
  • 计数器
  • XML/HTML 解析器
  • 配置文件
  • 缓存 API 响应
  • 状态机
  • 编码和解码数据

记忆化

记忆化是一种通过将先前函数调用的输出存储在缓存中来提高昂贵函数调用性能的方法。在 Python 中,我们可以利用字典来实现记忆化。这是通过定义一个字典来完成的,其中函数参数作为键,相应的函数输出作为值。在执行函数之前,我们可以检查结果是否已存在于字典中,如果存在,则检索缓存的输出而不是重新计算函数。让我们理解以下示例。

示例 -

解释 -

上面的代码首先定义了昂贵的函数,代表我们希望使用记忆化优化的耗时计算。然后它创建一个空缓存字典来存储函数结果。

memoized_function() 接受一个参数,并首先检查该参数的结果是否已存在于缓存中。如果存在,则检索并返回缓存的输出。如果不存在,则调用 expensive_function() 来计算函数输出,然后将其存储在缓存中以供将来使用。该函数最终返回计算结果。

稀疏矩阵

稀疏矩阵是其中大多数元素为零的矩阵。考虑到存储矩阵中的所有零将是低效的,因此可以使用字典仅存储非零元素。在这种方法中,字典中的键是包含非零矩阵元素索引的元组,而值是这些非零元素本身。

示例 &ndash

解释 -

sparse_matrix 字典包含稀疏矩阵的表示。在此特定示例中,矩阵有三个非零元素。

第一个非零元素位于矩阵的第一行和第一列,对应于字典中的键 (0, 0)。与此键关联的值为 1,表示矩阵中第 0 行第 0 列的元素为 1。

第二个非零元素位于矩阵的第二行和第三列,对应于字典中的键 (1, 2)。与此键关联的值为 3,表示矩阵中第 1 行第 2 列的元素为 3。

第三个非零元素位于矩阵的第三行和第二列,对应于字典中的键 (2, 1)。与此键关联的值为 5,表示矩阵中第 2 行第 1 列的元素为 5。

通过利用字典仅存储矩阵的非零元素,我们可以节省存储和操作零元素所需的内存和计算时间。

计数器

计算元素组合的频率是使用 Python 字典的一种有用技术。可以通过创建一个字典来实现,其中键是我们想要计数的元素组合,值是相应的频率。

例如,如果我们有一个单词列表并想要计算每个同时出现的单词对的频率,我们可以使用字典来实现。让我们理解以下示例。

示例 -

解释 -

在上面的代码中,我们创建了一个名为 pair_freq 的空字典,然后遍历单词列表,创建每个相邻单词对的元组。然后它检查该对是否已存在于字典中,如果存在,则将其频率加 1。如果该对不存在于字典中,则将其添加并将其频率设置为 1。

循环结束时,字典 pair_freq 包含原始列表中每个相邻单词对的频率。我们可以调整此方法来计算其他元素组合的频率,例如三元组或 n 元组。

XML/HTML 解析

在 Python 中,XML 和 HTML 文档中使用的标签可以表示为嵌套字典。我们可以使用 xmltodict 库将 XML 文档转换为 Python 字典。让我们看看以下 XML 文档。

示例 -

我们可以使用 xmltodict 库和以下代码将此 XML 文档转换为 Python 字典。

示例 -

输出

{
    'book': {
        'title': 'Python Tricks',
        'author': 'Dan Bader',
        'publisher': 'Real Python',
        'published_on': '2017-06-03'
    }
}

解释 -

在上面的代码中,我们导入 xmltodict 库,它提供了 parse() 函数,可用于将 XML 字符串转换为 Python 字典。XML 文档以字符串形式表示在 xml_str 变量中。

使用 xmltodict.parse() 解析 XML 字符串后,生成的 Python 字典存储在 book_dict 变量中。然后使用 print() 函数在控制台上显示字典的内容。

正如我们所看到的,XML 标签在生成的字典中表示为键,它们的值是标签的内容。如果 XML 文档中有嵌套标签,它们将作为嵌套字典表示在生成的 Python 字典中。

配置文件

在 Python 中,字典可以作为存储程序配置选项的便捷方式。我们可以定义一个具有默认值的字典,然后通过加载配置文件来修改或覆盖这些值。让我们理解以下示例。

示例 -

在这种情况下,DEFAULT_CONFIG 是一个包含四个键值对的字典,每个键值对代表一个具有默认值的配置选项。

要加载配置文件并修改字典中的值,可以使用像 configparser 这样的库。

示例 -

在此代码中,configparser 用于加载名为 myprogram.ini 的配置文件。假定配置文件有一个名为 [myprogram] 的部分,其中包含表示配置选项的键值对。

如果存在,DEFAULT_CONFIG 字典中的值将使用配置文件中的值进行更新。如果配置文件中未指定配置选项,则使用默认值。

这样,您可以通过在配置文件中指定配置选项来轻松修改 Python 程序的行为,而无需修改程序代码。

缓存 API 响应

在使用 API 时,为了避免发出不必要的请求,缓存响应以供将来使用会很有帮助。我们可以通过使用字典作为简单缓存来实现它,您可以在其中将 API 请求映射到其相应的响应。

要在 Python 中发出 API 请求,可以使用像 requests 这样的库。以下是使用字典缓存 API 响应的示例。

示例 -

说明

在此代码中,创建了一个空字典 cache 来存储 API 响应。定义了 get_api_data() 函数以发出 API 请求并缓存响应。

该函数检查请求的 API URL 是否已在缓存字典中。如果是,则函数返回缓存的响应。如果请求的 URL 不在缓存中,则函数使用 requests 库发出 API 请求,并将响应存储在缓存字典中以供将来使用。

通过使用字典作为缓存,我们可以避免发出冗余的 API 请求,并提高程序整体性能。

状态机

状态机是一种计算模型,用于描述处于多种状态之一的系统的行为。在 Python 中,我们可以使用字典来表示状态机,其中键表示状态,值也是字典,将输入符号映射到下一个状态。

以下是使用 Python 字典表示状态机的示例

示例 -

在上面的代码中,state_machine 是一个字典,表示一个简单的状态机,具有三种状态:'state_A'、'state_B' 和 'state_C'。嵌套字典根据输入符号“symbol_1”和“symbol_2”定义了状态之间可能的转换。

例如,如果当前状态是“state_A”并且输入符号是“symbol_1”,则下一个状态将是“state_B”。如果输入符号是“symbol_2”,则下一个状态将是“state_C”。

要使用此状态机,您首先需要设置初始状态,然后使用输入符号在状态之间进行转换。

输出

'state_B'
'state_A'

编码和解码数据

字典是 Python 中在不同格式之间编码和解码数据的有用工具。使用字典实现此目的的一种方法是将 JSON 对象编码为查询字符串或将查询字符串解码为 JSON 对象。

要使用字典将 JSON 对象编码为查询字符串,可以使用 urllib.parse.urlencode() 函数,该函数接受键值对字典并返回查询字符串。

示例 -

输出

'name=John+Doe&age=30&city=New+York'

解释 -

在上面的代码中,json_obj 字典表示一个具有三个键值对的 JSON 对象。urllib.parse.urlencode() 函数将 JSON 对象编码为查询字符串。

要使用字典将查询字符串解码为 JSON 对象,可以使用 urllib.parse.parse_qs() 函数,该函数接受查询字符串并返回键值对字典

示例 -

输出

'{"name": ["John Doe"], "age": ["30"], "city": ["New York"]}'

解释 -

在此示例中,query_string 变量表示一个具有三个键值对的查询字符串。urllib.parse.parse_qs() 函数用于将查询字符串解码为键值对字典,然后使用 json.dumps() 函数将其转换为 JSON 对象。

使用字典在不同格式之间编码和解码数据是 Python 中一个强大的工具,允许您处理各种格式的数据,而无需为每种格式编写自定义编码和解码函数。

结论

字典是 Python 中一种多功能且强大的数据结构,除了简单的键值映射之外,还有许多意想不到的用途。它们可以表示复杂的数据结构,例如图和状态机,并用于缓存 API 响应以及在不同格式之间编码/解码数据。

总之,了解 Python 字典的全部潜力可以帮助您编写更高效、简洁和富有表现力的代码,同时提高应用程序的性能和可伸缩性。