在 Python 中应该如何以及何时使用 Defaultdict?

已发表: 2022-10-06

在本教程中,您将学习如何在使用 Python 字典时使用 Python 集合模块中的defaultdict来更好地处理 KeyErrors。

在 Python 中,字典是一种强大的内置数据结构,它以键值对的形式存储数据。 您将使用键来访问字典并访问值。

但是,当您的 Python 脚本中有多个字典在代码执行期间被修改时,您经常会遇到 KeyErrors。 您可以通过几种不同的方式来处理它们。

在本教程中,您将学习:

  • KeyErrors 是什么以及它们出现的原因
  • 如何处理 KeyErrors
  • 如何使用 Python 的 defaultdict(继承自内置 dict 类的子类)更好地处理丢失的键

让我们开始!

Python 中的 KeyError 是什么?

1

在定义 Python 字典时,你应该注意你应该确保以下几点:

  • 键应该是唯一的——没有任何重复。
  • 当使用现有的可迭代对象作为字典的键时,您应该更喜欢使用不可变集合,例如元组。

所以一个键只有在字典中存在时才有效; 否则会导致 KeyErrors。

考虑以下字典books_authors ,其中键是书名,值是作者姓名。

您可以在 Python REPL 中与本教程一起编写代码。

 books_authors = { 'Deep Work':'Cal Newport', 'Hyperfocus':'Chris Bailey', 'Pivot':'Jenny Blake', 'The Happiness Equation':'Neil Pasricha' }

您可以使用密钥(书名)访问作者姓名。

 books_authors['Hyperfocus'] 'Chris Bailey'

要访问字典中的所有键值对,可以调用字典对象的items()方法,如下所示:

 for book,author in books_authors.items(): print(f"'{book}' by {author}")
 'Deep Work' by Cal Newport 'Hyperfocus' by Chris Bailey 'Pivot' by Jenny Blake 'The Happiness Equation' by Neil Pasricha

如果您尝试访问字典中不存在的键的值,Python 解释器会引发 KeyError。 当我们尝试访问不存在的键的值时,我们会遇到 KeyError,即“Grit”和“不存在的键”。

 books_authors['Grit']
 --------------------------------------------------------------------------- KeyError Traceback (most recent call last) <ipython-input-6-e1a4486f5ced> in <module> ----> 1 books_authors['Grit'] KeyError: 'Grit'
 books_authors['non-existent-key']
 --------------------------------------------------------------------------- KeyError Traceback (most recent call last) <ipython-input-7-a3efd56f69e5> in <module> ----> 1 books_authors['non-existent-key'] KeyError: 'non-existent-key'

那么如何在 Python 中处理 KeyErrors 呢?

有几种方法可以做到这一点,我们将在下一节中学习它们。

如何在 Python 中处理 KeyErrors

如何在 Python 中处理 KeyErrors

让我们学习如何使用以下方法处理 KeyErrors:

  • if-else 条件语句
  • Try-except 块
  • 字典方法.get()

#1。 使用 If-Else 条件语句

在 Python 中处理 KeyErrors 的最简单方法之一是使用 if-else 条件语句。

在 Python 中,if-else 语句具有以下通用语法:

 if condition: # do this else: # do something else
  • 如果条件为True ,则执行if主体中的语句,并且
  • 如果条件为False ,则执行else主体中的语句。

在此示例中,条件是检查该键是否存在于字典中。

如果键存在于字典中,则in运算符将返回True ,并且 if body 将被执行打印出相应的值。

 key = 'The Happiness Equation' if key in books_authors: print(books_authors[key]) else: print('Sorry, this key does not exist!') # Output # Neil Pasricha

如果字典中不存在该键,则in运算符返回False并执行else正文。 它打印出密钥不存在的消息。

 key = 'non-existent-key' if key in books_authors: print(books_authors[key]) else: print('Sorry, this key does not exist!') # Output # Sorry, this key does not exist!

#2。 使用 Try-Except 语句

2

另一种处理 KeyError 的常用方法是使用 Python 中的 try-except 语句。

通读以下代码块:

 key = 'non-existent-key' try: print(books_authors[key]) except KeyError: print('Sorry, this key does not exist!')
  • try块尝试检索与提供的键对应的值。
  • 如果键不存在,解释器会引发一个 KeyError,它在except块中作为异常处理。

#3。 使用 .get() 方法

在 Python 中,您可以使用内置的字典方法 .get() 来处理丢失的键。

使用get()方法的一般语法是dict.get(key,default_value)其中dict是 Python 中的有效字典对象。

– 如果键存在于字典中,则get()方法返回值。
– 否则,返回默认值。

在这个例子中, keys是一个我们想要访问其值的键的列表。 我们遍历键列表以从books_authors字典中检索相应的值。

在这里,我们使用了 .get() 方法,并将“不存在”作为默认值。

 keys = ['Grit','Hyperfocus','Make Time','Deep Work'] for key in keys: print(books_authors.get(key,'Does not exist'))

在上面的代码中:

  • 对于books_authors字典中存在的键, .get()方法返回相应的值。
  • 当键不存在时,在本例中为“Grit”和“Make Time”,.get() 方法返回默认值“不存在”。
 # Output Does not exist Chris Bailey Does not exist Cal Newport

以上所有方法都有助于我们处理关键错误。 但是,它们很冗长,需要我们显式处理丢失的键。 您可以通过使用defaultdict而不是常规字典来简化此过程。

Python中的默认字典

python-defaultdict

defaultdict 是字典 ( dict ) 类的子类。 所以它继承了 Python 字典的行为。 此外,它还原生处理丢失的键。

defaultdict是一种容器数据类型,内置于 Python 标准库中——在collections模块中。

所以你必须将它导入你的工作环境:

 from collections import defaultdict

这是使用defaultdict的一般语法:

 defaultdict(default_factory)

您可以将 int、float 或 list 等可调用对象指定为default_factory属性。 如果您没有为default_factory提供值,则默认为None

当您要查找的键不存在时,会触发__missing__()方法,并从default_factory推断默认值。 然后它返回这个默认值。

总之:

  • 在 Python 中,当键不存在时, defaultdict返回默认值。
  • 它还将这个键-默认值对添加到字典中,然后您可以对其进行修改。

Python 默认字典示例

Defaultdict-Examples-1

接下来,我们将编写几个示例来了解 Python defaultdict 的工作原理。

Python中具有默认整数值的Defaultdict

首先,从collections模块导入defaultdict

 from collections import defaultdict import random

让我们创建一个 defaultdict prices

 prices = defaultdict(int)

我们现在使用fruits列表中的项目作为键来填充prices字典。 我们从price_list中随机采样值以获取值。

 price_list = [10,23,12,19,5] fruits = ['apple','strawberry','pomegranate','blueberry'] for fruit in fruits: prices[fruit] = random.choice(price_list)

让我们看一下prices中的键值对。

 print(prices.items())
 dict_items([('apple', 12), ('blueberry', 19), ('pomegranate', 5), ('strawberry', 10)])

像普通的 Python 字典一样,您可以使用键访问prices defaultdict 的值:

 prices['apple'] # 23

现在,让我们尝试访问不存在的水果的价格,例如“橙子”。 我们看到它返回默认值零。

 prices['orange'] # 0

如果我们打印出字典,我们会看到添加了一个新键“orange”,默认整数值为零。

 print(prices.items())
 dict_items([('apple', 12), ('blueberry', 19), ('pomegranate', 5), ('strawberry', 10), ('orange', 0)])

Python中的Defaultdict,以List为默认值

让我们将students_majors定义为列表的defaultdict 。 专业的名字是关键。 这些值是攻读每个专业的学生名单,例如数学、经济学、计算机科学等。

 from collections import defaultdict students_majors = defaultdict(list)

如果我们尝试访问 'Economics' 对应的学生列表,defaultdict 返回一个空列表; 没有关键错误!

 students_majors['Economics'] # []

我们现在有一个映射到“经济学”专业的空列表。 所以我们现在可以使用列表方法.append()将元素添加到这个列表中。

 students_majors['Economics'].append('Alex')

students_majors默认字典中为“经济学”创建了一个条目。

 print(students_majors)
 defaultdict(<class 'list'>, {'Economics': ['Alex']})

您可以将更多学生添加到映射到经济学专业的列表中,添加新专业等等!

 students_majors['Economics'].append('Bob') students_majors['Math'].append('Laura') print(students_majors)
 defaultdict(<class 'list'>, {'Economics': ['Alex', 'Bob'], 'Math': ['Laura']})

结论

我希望本教程能帮助您了解如何以及何时在 Python 中使用defaultdict 。 运行本教程中的代码示例后,您可以在需要时尝试使用 defaultdict 作为项目中的首选数据结构。

这是您在本教程中学到的内容的摘要。

  • 使用 Python 字典时,您经常会遇到 KeyErrors。
  • 要处理此类 KeyErrors,您可以使用一些详细的方法。 您可以使用条件语句、try-except 块或 .get() 方法。 但是 collections 模块中的 defaultdict 数据类型可以简化这个 KeyError 处理。
  • 您可以使用defaultdict(default_factory)其中default_factory是有效的可调用对象。
  • 当 key 在 defaultdict 中不存在时,默认值(从default_factory推断)和 key 被添加到 defaultdict。

接下来,查看有关 Python 地图功能的教程。