你应该如何使用Python中的Defaultdict?
在本教程中,您将学习如何在使用Python字典时使用Python的collections模块中的defaultdict来更好地处理KeyErrors。
在Python中,字典是一种强大的内置数据结构,它以键值对的形式存储数据。您将使用键来访问字典并获取值。
然而,当您的Python脚本中有多个在代码执行期间被修改的字典时,通常会遇到KeyErrors。您可以使用几种不同的方法来处理它们。
在本教程中,您将学到:
- 什么是KeyErrors以及为什么会出现
- 如何处理KeyErrors
- 如何使用Python的defaultdict,它是从内置dict类继承而来的子类,以更好地处理缺失的键
让我们开始吧!
Python中的KeyErrors是什么?
在定义Python字典时,您应该确保以下几点:
- 键应该是唯一的 – 没有重复。
- 在使用现有可迭代对象作为字典的键时,应优先使用immutable collection such as a tuple。
因此,只有当键存在于字典中时,它才是有效的;否则它会导致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的教程。