在 Python 中应该如何以及何时使用 Defaultdict?
已发表: 2022-10-06在本教程中,您将学习如何在使用 Python 字典时使用 Python 集合模块中的defaultdict来更好地处理 KeyErrors。
在 Python 中,字典是一种强大的内置数据结构,它以键值对的形式存储数据。 您将使用键来访问字典并访问值。
但是,当您的 Python 脚本中有多个字典在代码执行期间被修改时,您经常会遇到 KeyErrors。 您可以通过几种不同的方式来处理它们。
在本教程中,您将学习:
- KeyErrors 是什么以及它们出现的原因
- 如何处理 KeyErrors
- 如何使用 Python 的 defaultdict(继承自内置 dict 类的子类)更好地处理丢失的键
让我们开始!
Python 中的 KeyError 是什么?

在定义 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

让我们学习如何使用以下方法处理 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 语句

另一种处理 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中的默认字典

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 默认字典示例

接下来,我们将编写几个示例来了解 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 地图功能的教程。