在本章中,你将学习能够将相关信息关联起来的Python字典。

6.1 一个简单的字典

image.png
感觉字典很像Java里面的类的属性啊。

6.2 使用字典

在Python中,字典字是一系列键值对。每个键都与一个值相关联,你可以使用键来访问与之相关联的值。与键相关联的值可以是数字、字符串、列表乃至字典。事实上,可将任何Python对象用作字典中的值。

在Python中,字典用放在花括号{} 中的一系列键—值对表示,如前面的示例所示:

访问外星人alien_0的颜色和点数。如果玩家射杀了这个外星人,你就可以通过下面的代码来确定玩家应该获得多少点数。

image.png
image.png

6.2.2 添加键——值对

由于屏幕坐标系的原点通常为左上角,因此要将该外星人放在屏幕左边缘,可将 x 坐标设置为0;要将该外星人放在离屏幕顶部25像素的地方,可将 y 坐标设置为25,如下所示:
image.png

6.2.3 先创建一个空字典

image.png
赋值和修改使用的方法是一样的。

image.png

image.png
image.png

6.2.6 由类似对象组成的字典

在前面的示例中,字典存储的是一个对象(游戏中的一个外星人)的多种信息,但你也可以使用字典来存储众多对象的同一种信息。例如,假设你要调查很多人,询问他们最喜欢的编程语言,可使用一个字典来存储这种简单调查的结果,如下所示:

image.png

image.png

6.3 遍历字典

遍历字典的方式:可遍历字典的所有键—值对、键或值。

6.3.1 遍历所有的键——值对

image.png
image.png

要编写用于遍历字典的for 循环,可声明两个变量,用于存储键—值对中的键和值。对于这两个变量,可使用任何名称。

for 语句的第二部分包含字典名和方法items() ,它返回一个键—值对列表。

6.3.2 遍历字典中的所有键

在不需要使用字典中的值时,方法keys() 很有用。下面来遍历字典favorite_languages ,并将每个被调查者的名字都打印出来:

image.png
image.png

遍历字典时,会默认遍历所有的键,因此,如果将上述代码中的for name in favorite_languages.keys(): 替换为for name in favorite_languages: ,输出将不变。
如果显式地使用方法keys() 可让代码更容易理解,你可以选择这样做,但如果你愿意,也可省略它。

image.png
image.png
方法keys() 并非只能用于遍历;实际上,它返回一个列表,其中包含字典中的所有键

6.3.3 按顺序遍历字典中所有键

字典总是明确地记录键和值之间的关联关系,但获取字典的元素时,获取顺序是不可预测的。这不是问题,因为通常你想要的只是获取与键相关联的正确的值。
要以特定的顺序返回元素,一种办法是在for 循环中对返回的键进行排序。为此,可使用函数sorted() 来获得按特定顺序排列的键列表的副本:

image.png
image.png

6.3.4 遍历字典中的所有的值

如果你感兴趣的主要是字典包含的值,可使用方法values() ,它返回一个值列表,而不包含任何键。
image.png
image.png

这种做法提取字典中所有的值,而没有考虑是否重复。涉及的值很少时,这也许不是问题,但如果被调查者很多,最终的列表可能包含大量的重复项。为剔除重复项,可使用集
合(set)。集合类似于列表,但每个元素都必须是独一无二的:

image.png
image.png

6.4 嵌套

有时候,需要将一系列字典存储在列表中,或将列表作为值存储在字典中,这称为嵌套。

6.4.1 字典列表

字典alien_0 包含一个外星人的各种信息,但无法存储第二个外星人的信息,更别说屏幕上全部外星人的信息了。如何管理成群结队的外星人呢?一种办法是创建一个外星人列表,其中每个外星人都是一个字典,包含有关该外星人的各种信息。例如,下面的代码创建一个包含三个外星人的列表:

image.png
image.png

利用range()自动生成30个外星人

image.png

image.png

鉴于我们要修改前三个外星人,需要遍历一个只包含这些外星人的切片。当前,所有外星人都是绿色的,但情况并非总是如此,因此我们编写了一条if 语句来确保只修改绿色外星人。如果外星人是绿色的,我们就将其颜色改为’yellow’ ,将其速度改为’medium’ ,并将其点数改为10 ,如下面的输出所示:
image.png
image.png

你可以进一步扩展这个循环,在其中添加一个elif 代码块,将黄色外星人改为移动速度快且值15个点的红色外星人:
image.png

image.png

6.4.2 在字典中存储列表

有时候,需要将列表存储在字典中,而不是将字典存储在列表中。
例如,你如何描述顾客点的比萨呢?如果使用列表,只能存储要添加的比萨配料;但如果使用字典,就不仅可在其中包含配料列表,还可包含其他有关比萨的描述。

image.png
image.png

image.png
image.png

6.4.3 在字典中存储字典

image.png
image.png