如何在 Python 中使用使用字典
发布日期:
本文内容
理解字典后,你就能够更准确地为各种真实物体建模。你可以创建一个表示人的字典,然后在其中存储你想存储的任何信息:姓名、年龄、地址,以及可以描述这个人的任何其他方面。你还能够在字典中存储任意两种相关的信息,如一系列单词及其含义、一系列人名及其喜欢的数字、一系列山脉及其海拔等。
一个简单的字典
考虑一个包含外星人的游戏,这些外星人的颜色和分数各不相同。下面是一个简单的字典,用于存储有关特定外星人的信息:
|
|
字典 alien_0
存储了这个外星人的颜色和分数。最后两行代码访问并显示这些信息,结果如下:
|
|
与大多数编程概念一样,要熟练使用字典,需要一段时间的练习。随着经验的积累,你会明白它们为何能高效地模拟现实世界中的情形。
使用字典
在 Python 中,字典是一系列键值对。每个键都与一个值关联,你可以使用键来访问与之关联的值。与键相关联的值可以是数、字符串、列表乃至字典。实际上,你可以将任意 Python 对象作为字典中的值。
Python 中的字典用花括号 {}
表示,包含一系列键值对,如前面的示例所示:
|
|
键值对包含两个相互关联的值。当你指定键时,Python 将返回与之关联的值。键和值之间用冒号分隔,而键值对之间用逗号分隔。在字典中,你可以存储任意数量的键值对。
最简单的字典只有一个键值对,如下述修改后的字典 alien_0
所示:
|
|
这个字典只存储了一项有关 alien_0
的信息,具体地说是这个外星人的颜色。在这个字典中,字符串 'color'
是一个键,与之关联的值为 'green'
。
访问字典中的值
要获取与键关联的值,可以指定字典名并把键放在方括号内,如下所示:
|
|
这将返回字典 alien_0
中与键 'color'
关联的值:
|
|
字典中可以包含任意数量的键值对。例如,最初的字典 alien_0
包含两个键值对:
|
|
现在,你可以访问外星人 alien_0
的颜色和分数。如果玩家消灭了这个外星人,就可以使用下面的代码来确定玩家应获得多少分:
|
|
上述代码首先定义了一个字典。然后,从这个字典中获取与键 'points'
关联的值,并将这个值赋给变量 new_points
。最后一行打印一条消息,指出玩家获得了多少分:
|
|
如果在外星人被消灭时运行这段代码,你将获取该外星人的分数。
添加键值对
字典是一种动态结构,可随时在其中添加键值对。要添加键值对,只需依次指定字典名、用方括号括起来的键和与该键关联的值。
下面在字典 alien_0
中添加两项信息:外星人的 x
坐标和 y
坐标,以便在屏幕的特定位置上显示该外星人。我们将这个外星人放在屏幕左边缘上,距离屏幕上边缘 25
像素。由于屏幕坐标系的原点通常在左上角,因此要将该外星人放在屏幕左边缘,可将 x
坐标设置为 0
;要将该外星人放在距离屏幕上边缘 25
像素的地方,可将 y
坐标设置为 25
,如下所示:
|
|
首先定义前面一直在使用的字典,然后打印这个字典,以显示其信息快照。接下来,在这个字典中新增一个键值对,其中的键为 'x_position'
、值为 0
。然后重复同样的操作,但使用的键为 'y_position'
、值为 25
。打印修改后的字典,将看到这两个新增的键值对:
|
|
这个字典的最终版本包含 4 个键值对,其中原来的两个指定外星人的颜色和分数,而新增的两个指定其位置。
字典会保留定义时的元素排列顺序。如果将字典打印出来或遍历其元素,你会发现元素的排列顺序与其添加顺序相同。
从创建一个空字典开始
有时候,在空字典中添加键值对很方便,甚至是必需的。为此,可以先使用一对空花括号定义一个空字典,再分行添加各个键值对。例如,下面演示了如何以这种方式创建字典 alien_0
:
|
|
首先定义一个空字典 alien_0
,然后在其中逐行添加颜色和分数,最终得到我们一直在使用的字典:
|
|
如果要使用字典来存储用户提供的数据或者编写能自动生成大量键值对的代码,通常需要先定义一个空字典。这种方法特别适用于动态生成数据或处理不确定数量的数据输入时。
修改字典中的值
要修改字典中的值,只需依次指定字典名、用方括号括起来的键和与该键关联的新值。假设随着游戏的进行,需要将一个外星人从绿色改为黄色:
|
|
首先定义一个表示外星人 alien_0
的字典,其中只包含这个外星人的颜色。接下来,将与键 'color'
关联的值改为 'yellow'
。输出表明,这个外星人确实从绿色变成了黄色:
|
|
来看一个更有趣的例子:对一个能够以不同速度移动的外星人进行位置跟踪。为此,存储该外星人的当前速度,并据此确定该外星人应该向右移动多远:
|
|
首先定义一个外星人,其中包含初始 x
坐标和 y
坐标,还有速度 'medium'
。为了简化,这里省略了颜色和分数,但即便包含这些键值对,这个示例的工作原理也不会有任何变化。我们还打印了 x_position
的初始值,让用户知道这个外星人向右移动了多少。
使用一个 if-elif-else
语句来确定外星人应该向右移动多远,并将这个值赋给变量 x_increment
。如果外星人的速度为 'slow'
,它将向右移动 1 个单位;如果速度为 'medium'
,将向右移动 2 个单位;如果速度更快,将向右移动 3 个单位。确定移动量后,将其与 x_position
的当前值相加,再将结果关联到字典中的键 x_position
。
因为这是一个速度中等的外星人,所以其位置将向右移动 2 个单位:
|
|
这种技巧非常有用:通过修改外星人字典中的值,可以改变外星人的行为。例如,要将这个速度中等的外星人变成速度很快的外星人,可以添加如下代码行:
|
|
这样,再次运行这些代码时,if-elif-else
语句将把一个更大的值赋给变量 x_increment
。
删除键值对
对于字典中不再需要的信息,可以使用 del
语句将相应的键值对彻底删除。在使用 del
语句时,必须指定字典名和要删除的键。
例如,下面的代码从字典 alien_0
中删除键 'points'
及其值:
|
|
这里的 del
语句让 Python 将键 'points'
从字典 alien_0
中删除,同时删除与这个键关联的值。输出表明,键 'points'
及其值 5
已被从字典中删除,但其他键值对未受影响:
|
|
需要注意的是,一旦使用 del
语句删除了某个键值对,该键值对就会永远消失。因此,在执行删除操作之前,请确保你确实不再需要这些信息。
这种技巧非常有用,尤其是在你需要清理不再相关的数据或减少内存占用时。通过灵活使用 del
语句,你可以保持字典的整洁和高效。
由类似的对象组成的字典
在前面的示例中,字典存储的是单个对象(如游戏中的一个外星人)的多种信息。然而,你也可以使用字典来存储多个对象的同一种信息。假设你要进行一项调查,询问人们喜欢的编程语言,可以使用一个字典来存储这种简单调查的结果,如下所示:
|
|
可以看到,我们将一个较大的字典放在了多行中定义。每个键都是被调查者的名字,而每个值则是他们喜欢的编程语言。当需要在多行中定义字典时,可以在输入左花括号后按回车键,在下一行缩进 4 个空格来指定第一个键值对,并在其后面加上一个逗号。接下来的每一行都会自动缩进相同的距离,确保格式的一致性。
定义好字典后,在最后一个键值对的下一行添加右花括号,并且也缩进 4 个空格,使其与字典中的键对齐。这是一种良好的实践,有助于代码的可读性和维护性。此外,在最后一个键值对后面加上逗号,可以方便以后添加新的键值对。
大多数编辑器为较长的列表和字典提供了类似的格式设置功能。虽然这里展示了一种常见的格式设置方式,但在你的编辑器或其他源代码中,可能会看到稍微不同的格式设置方法。
定义好字典后,你可以轻松地获取特定人的偏好。例如,要了解 Sarah 喜欢的语言,可以使用以下代码:
|
|
为了获取 Sarah 喜欢的语言,我们使用 favorite_languages['sarah']
来访问相应的值。通过这种方式获取 Sarah 喜欢的语言,并将其转换为首字母大写的字符串后赋给变量 language
。这样做不仅使得函数调用 print()
更加整洁,还提高了输出的可读性:
|
|
这种语法可以用来从字典中获取任何被调查者喜欢的编程语言,展示了如何利用字典高效地管理和查询大量相似类型的数据。这种方法非常适合用于处理问卷调查、用户偏好等场景。
使用 get() 来访问值
直接使用方括号和键从字典中获取值可能会引发问题,特别是当指定的键不存在时。例如,如果你尝试获取一个外星人的分数,但该外星人并没有分数记录,那么程序将会抛出错误:
|
|
上述代码将导致 Python 显示 traceback 并指出存在键值错误(KeyError):
|
|
为了避免这种情况,可以使用字典的 get()
方法。get()
方法允许你在指定的键不存在时返回一个默认值。其第一个参数是必需的,用于指定键;第二个参数是可选的,用于指定在找不到键时要返回的默认值。
例如:
|
|
在这个例子中,如果字典中有键 'points'
,你将获得与之关联的值;如果没有,你将获得指定的默认值 'No point value assigned.'
。由于这里没有键 'points'
,输出将是:
|
|
这种方法不仅避免了程序因键不存在而崩溃,还提供了清晰的反馈信息。
注意:当你调用
get()
而没有提供第二个参数且指定的键不存在时,Python 将返回None
。None
是一个特殊的值,表示没有相应的值,并非错误。它只是表明所需值不存在。
总之,当处理可能不存在的键时,建议使用 get()
方法而不是方括号表示法。这不仅能防止程序出现错误,还能提高用户体验,确保即使在缺少某些数据的情况下,程序也能正常运行并给出合理的反馈。