Python教程-Python KeyError
在Python中,映射是一种将一个集合映射到另一个值集合的数据结构。Python字典是最常用的映射数据结构。每个值都分配了一个键,该键可用于查看该值。KeyError在查找值时,当键不存在于映射中时发生。
除了其基本用途之外,Python映射还具有几个额外的优点。在某些情况下,可以使用映射来替代列表。尽管列表是Python中常用的数据结构,但随着列表的增长,查找列表中的特定值可能会花费更多时间,因此在需要快速访问数据时,可以使用映射。
此外,Python还提供了使用字典推导来构建字典或映射的实用方法。开发人员可以使用此功能快速轻松地从任何可迭代对象(如列表、元组或集合)生成字典。
Python映射还具有其他额外的优点。在某些情况下,可以使用映射来代替列表。尽管列表是Python中常用的数据结构,但在需要使用特定键快速访问数据时,映射可能是更好的选择,因为随着列表的增长,查找特定值可能需要更长的时间。
此外,Python还提供了一种通过字典推导构建字典或映射的实用方法。开发人员可以使用此功能快速有效地生成来自任何可迭代对象(如列表、元组或集合)的字典。
本文将讨论Python中的KeyError以及如何处理KeyError,附带示例。但在讨论Python KeyError之前,我们将了解Python字典。
Python中的字典
Python中的字典(dict)是一个包含存储数据值的值的离散集合,相当于一个映射。它与其他数据类型不同,因为它只有一个元素:单个值。它包含键和值对。由于键值,它更有效。冒号表示键和值对的分隔,逗号表示每个键的分隔。这个Python字典的工作方式与普通字典相同。键必须是唯一的,并由不可更改的数据类型组成,包括字符串、整数和元组。
在Python中使用字典的一个主要好处是可以快速获取数据。在处理大量数据时,根据键查找特定值非常快,因为字典使用哈希表来存储键-值对。因此,经常需要搜索数据的应用程序的最佳选择是字典。另一个关键方面是Python字典可以被修改。这意味着在创建字典后,您可以添加、更改或删除键-值对。当保存的数据是动态的并且随时间经常发生更改时,这尤其有帮助。
除了这些优点,可以使用各种复杂的技术和最佳实践来处理Python中的字典。例如,使用字典推导将可迭代对象转化为字典是创建复杂数据结构的一种非常有效的方法。此外,使用内置方法如get()
和setdefault()
可以简化处理缺失或默认数据。
通过强调这些特性和推荐的最佳实践,开发人员可以更好地理解如何在他们的Python应用程序中使用字典。了解如何在Python中使用字典可能对您的成功至关重要,无论是创建简单的脚本还是复杂的应用程序。
例如:
让我们举一个例子来理解如何使用Python的字典(dict)。
# Create an empty dictionary
my_dict = {}
print("Empty dictionary: ")
print(my_dict)
# Create a dictionary using strings as keys
fruit_dict = {'apple': 2, 'orange': 3, 'banana': 5}
print("\n Dictionary with string keys: ")
print(fruit_dict)
# Create a dictionary using tuples as keys
grade_dict = {('John', 'Math'): 85, ('Jane', 'Science'): 92, ('Bob', 'English'): 78}
print("\n Dictionary with tuple keys: ")
print(grade_dict)
# Create a dictionary using the dict() method
student_dict = dict(name='John', age=20, major='Computer Science')
print("\n Dictionary with the use of dict(): ")
print(student_dict)
# Create a dictionary with nested dictionaries
course_dict = {'CS101': {'title': 'Introduction to Computer Science', 'credits': 4},
'ENG201': {'title': 'Advanced English', 'credits': 3},
'HIS101': {'title': 'World History', 'credits': 3}}
print("\n Dictionary with nested dictionaries: ")
print(course_dict)
# Create a dictionary with a list as its value
fruits = ['apple', 'orange', 'banana']
price = [2, 3, 5]
fruits_price_dict = dict(zip(fruits, price))
print( "\n Dictionary with a list as its value: " )
print( fruits_price_dict )
输出:
Empty dictionary:
{}
Dictionary with string keys:
{'apple': 2, 'orange': 3, 'banana': 5}
Dictionary with tuple keys:
{('John', 'Math'): 85, ('Jane', 'Science'): 92, ('Bob', 'English'): 78}
Dictionary with the use of dict():
{'name': 'John', 'age': 20, 'major': 'Computer Science'}
Dictionary with nested dictionaries:
{'CS101': {'title': 'Introduction to Computer Science', 'credits': 4},
'ENG201': {'title': 'Advanced English', 'credits': 3},
'HIS101': {'title': 'World History', 'credits': 3}}
Dictionary with a list as its value:
{'apple': 2, 'orange': 3, 'banana': 5}
Python中的KeyError
当我们尝试从字典中访问不存在的键时,Python会引发KeyError。这是由与包含键-值对的字典或包含键-值对的对象交互的多个模块引发的内置异常类。现在,我们知道Python字典是什么以及它的工作原理,让我们看看什么是KeyError。每当我们尝试访问Python字典中不存在的键时,Python都会引发KeyError。
映射逻辑是一种将一组数据与其他重要数据连接的数据结构。因此,当访问映射但未找到时,会引发错误。这类似于查找错误,其中语义错误是我们正在查找的键不在其内存中。下面的示例更好地表示了这一点。
除了字典之外,访问其他映射类型中的键时也可能引发KeyError异常,例如defaultdict或OrderedDict。虽然这些映射对象类似于字典,但它们还包含在某些情况下可能有用的不同属性。例如,defaultdict给空键一个默认值,而不像OrderedDict一样跟踪项目添加到映射中的顺序。因此,在使用这些对象时需要注意这一点。
为了防止KeyError错误,最好的实践是在访问之前检查键是否存在于字典中。我们可以使用'in'关键字来确定字典中是否存在一个键。如果键在字典中不存在,可以使用'get'方法而不是引发KeyError异常。这种方法在这种情况下返回None。
总之,KeyError异常在Python中经常出现,当尝试访问字典或其他映射对象中不存在的键时。如果我们了解这个异常并知道如何处理它,我们可以构建更可靠和无错误的Python代码。
例如:
让我们通过一个示例来理解如何在Python中看到KeyError。我们使用键A、B、C和D,其中D在Python字典中不存在。尽管字典中存在的键可以正确显示输出,但D会显示KeyError。
# Check the Keyerror
ages={'A':45,'B':51,'C':67}
print(ages['A'])
print(ages['B'])
print(ages['C'])
print(ages['D'])
输出:
执行上面的代码后,我们将得到如下所示的输出:
45
51
67
Traceback (most recent call last):
File "", line 6, in
KeyError: 'D'
Python中的KeyError处理机制
任何遇到KeyError的人都可以负责地处理它。它可以检查特定程序的所有可能输入,并正确处理任何危险的输入。当我们遇到KeyError时,有一些常见的方法可以处理它。此外,还可以使用处理Python中KeyError的机制来处理一些方法。
常用的.get()函数
在Python中,经常使用.get()
函数来处理KeyError错误。它可以提供与使用方括号从字典中获取值相同的能力,通过检索给定键的值来从字典中获取值。但是,与引发KeyError不同,.get()
将提供一个默认值,该默认值可以在字典中不包含键时指定。当我们希望更优雅地处理丢失的键并防止代码崩溃时,这是有用的。
在字典对象上调用.get()
的语法很简单:我们将要返回值的键作为第一个参数传递。第二个选项可以是默认值,如果字典不包含该键,将使用默认值而不是引发KeyError。例如,我们可以使用my_dict.get("my_key")
来获取字典my_dict
中键my_key
的值。如果字典包含my_key
,它将返回匹配的值。如果没有,.get()
的默认返回值是None。我们可以通过将其作为第二个选项添加并将其指定为my_dict.get("my_key", "default_value")
来选择不同的默认值。
例如:
products = {"Apple": 50, "Banana": 30, "Orange": 40}
product = input("Get price for: ")
product_price = products.get(product)
if product_price:
print("{product} is {product_price} rupees.")
else:
print("{product}'s cost is unknown.")
输出:
Get price for: Apple
Apple is 50 rupees.
Get price for: Mango
Mango's cost is unknown.
通用的KeyError解决方案:try-except方法
另一种处理KeyError的常见Python技术是使用try-except块。可能引发KeyError的代码位于try块中,而在except块中处理问题。
products = {"Apple": 50, "Banana": 30, "Orange": 40}
product = input("Get price for: ")
try:
product_price = products[product]
print(product, " is " ,product_price," rupees.")
except KeyError:
print(product,"'s cost is unknown.")
输出:
Get price for: Apple
Apple is 50 rupees.
Get price for: Litchi
Litchi 's cost is unknown.
在上面的示例中,代码尝试使用索引技术从products字典中获取输入的产品键的值。如果键存在于字典中,将打印相关值;否则,将引发KeyError异常,并运行except块以处理问题。
try-except非常适合处理否则会导致程序崩溃或出现意外行为的异常。此外,它允许更宽容的错误处理,可以为用户提供更具洞察力的错误消息。
使用"in"运算符
Python中的KeyError异常也可以使用in运算符来处理。在尝试访问键之前,可以使用in运算符来了解它是否存在于字典中。
首先定义要使用的字典。
使用in运算符:可以使用in运算符来了解键是否存在于字典中,以处理KeyError。在字典中,语法是"key" in dictionary。
示例:
my_dict = {"a": 1, "b": 2, "c": 3}
if "a" in my_dict:
print("Value to the Key is:", my_dict["a"])
else:
print("Key not found")
输出:
Value to the Key is: 1
示例2:
my_dict = {"a": 1, "b": 2, "c": 3}
if "d" in my_dict:
print("Value to the Key is:", my_dict["a"])
else:
print("Key not found")
输出:
Key not found
在上面的代码中,使用if "a" in my_dict:来检查键"a"是否存在于my_dict中。如果键存在,我们使用my_dict["a"]来获取其值并执行所需的操作。如果键不存在,我们在else部分运行函数。通过使用in运算符在尝试访问其值之前显式检查键是否存在,可以防止KeyError。
处理键不存在的情况:您可以在else部分插入代码以处理此情况。这可以包括错误消息、备用操作或最适合您需求的任何其他逻辑。
通过主动使用in运算符检查键是否在字典中,可以避免KeyError并防止程序崩溃。
使用DefaultDict来处理KeyError的新方法
Python的内置dict类是collections模块中的defaultdict类的子类。它旨在为字典中不存在的键提供默认值,有助于解决KeyError错误。
要使用它,必须从collections模块导入defaultdict,并使用默认值类型进行初始化。与引发KeyError不同,defaultdict将返回键类型的默认值,而不是引发异常,当尝试访问无效键时。
以下是如何使用defaultdict处理KeyError的示例:
from collections import defaultdict
# Define a defaultdict with a default value as 0
my_dict = defaultdict(int)
#Creating a Dictionary and then Printing It
my_dict['a'] = 2
my_dict['b'] = 5
my_dict['c'] = 6
print(my_dict)
# Access a key that doesn't exist
value = my_dict['f']
print(value)
#Accesing Key that does Exist
print(my_dict['a'])
print(my_dict['b'])
输出:
defaultdict(<class 'int'>, {'a': 2, 'b': 5, 'c': 6})
0
2
5
解释:
- 从collections模块中导入defaultdict类。
- 创建名为my_dict的defaultdict,其默认值为int(即0)。字典中不存在的任何键都将具有默认值0。
- 为my_dict中的键'a'、'b'和'c'分配值。这些键是显式创建在字典中的。
- 打印my_dict的内容。输出将显示字典中的键-值对,包括显式分配的键及其相应的值。
- 尝试访问my_dict中的键'f'。由于该键在字典中不存在,通常会引发KeyError异常。但是,由于my_dict是具有默认值int(0)的defaultdict,因此访问不存在的键会返回默认值,而不会引发异常。值将分配为0。
- 打印值的值。它将为0,因为'f'在my_dict中不存在,使用了默认的int值。
- 访问my_dict中的键'a'和'b',以演示访问现有键的工作方式。将打印分配给这些键的相应值(2和5)。
为不存在于字典中的键提供默认值显示了如何使用defaultdict处理KeyError错误。它简化了代码,消除了需要显式测试KeyError的需求。
结论
现在,我们了解了Python的Keyerror异常可能在哪些常见情况下被引发,以及一些优秀的策略,可以防止它们终止我们的程序。下次遇到Keyerror时,我们将知道它很可能是由于有问题的字典键查找引起的。通过查看回溯的最后几行,我们可以获得所有必要的信息,以确定问题的根本原因。
如果问题出现在我们的代码中的字典键查找中,我们可以使用更安全的.get()函数,而不是直接在字典上查询键,从而获得具有默认返回值的函数。如果我们的代码没有引发问题,那么try-except块是规范代码流的最佳选择。
异常并不可怕。如果我们理解了它们的回溯中呈现的信息和错误的根本原因,我们可以利用这些方法使我们的程序更可预测地流动。