你应该如何使用Python中的Defaultdict?

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

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

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

在本教程中,您将学到:

  • 什么是KeyErrors以及为什么会出现
  • 如何处理KeyErrors
  • 如何使用Python的defaultdict,它是从内置dict类继承而来的子类,以更好地处理缺失的键

让我们开始吧!

Python中的KeyErrors是什么?

在定义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。当我们尝试访问不存在的键的值时,即'Grit'和'non-existent key',我们会遇到KeyError。

books_authors['Grit']
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
 in 
----> 1 books_authors['Grit']

KeyError: 'Grit'
books_authors['non-existent-key']
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
 in 
----> 1 books_authors['non-existent-key']

KeyError: 'non-existent-key'

那么如何处理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体中的语句打印出相应的值。

key = 'The Happiness Equation'
if key in books_authors:
  print(books_authors[key])
else:
  print('对不起,该键不存在!')

# 输出
# Neil Pasricha

如果字典中不存在该键,in运算符返回False并执行else体。它打印出一个键不存在的消息。

key = 'non-existent-key'
if key in books_authors:
  print(books_authors[key])
else:
  print('对不起,该键不存在!')

# 输出
# 对不起,该键不存在!

#2. 使用Try-Except语句

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

请阅读以下代码块:

key = 'non-existent-key'
try:
  print(books_authors[key])
except KeyError:
  print('对不起,该键不存在!')
  • 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,'不存在'))

在上面的代码中:

  • 对于存在于books_authors字典中的键,.get()方法返回相应的值。
  • 当键不存在时,即'Grit'和'Make Time'的情况下,.get()方法返回默认值'不存在'。
# 输出

不存在
Chris Bailey
不存在
Cal Newport

所有上述方法都帮助我们处理键错误。然而,它们冗长且要求我们明确处理缺少的键。您可以通过使用defaultdict而不是常规字典来简化此过程。

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示例

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

Python中具有默认整数值的Defaultdict

首先,从collections模块导入defaultdict

from collections import defaultdict
import random

让我们创建一个默认字典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默认字典的值:

prices['apple']
# 23

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

prices['orange']
# 0

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

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

Python中具有列表作为默认值的Defaultdict

让我们将students_majors定义为列表的defaultdict。专业的名称是键。而值是追求各个专业的学生列表,例如数学、经济、计算机科学等。

from collections import defaultdict
students_majors = defaultdict(list)

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

students_majors['Economics']
# []

我们现在将一个空列表映射到“Economics”专业。因此,我们现在可以使用列表方法.append()向该列表添加元素。

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

students_majors默认字典中创建了一个“Economics”的条目。

print(students_majors)
defaultdict(, {'Economics': ['Alex']})

您可以向与经济学专业相关的列表中添加更多学生,添加新专业等等!

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

结论

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

以下是您在本教程中学到的内容总结。

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

接下来,请查看有关Python map function的教程。

类似文章