
4.5 字典
编程世界的很多设定灵感都来源于现实世界中,字典和集合这种数据结构就是一个很好的例子。它的组织形式也正如现实世界中的字典那样,使用“名称-内容”的方式进行数据的存储。
4.5.1 定义
简单来说,字典(dict)是一系列键(key)与值(value)的对应关系。什么是键呢?我们可以把键理解为数据的编号或者索引,每个键都与一个数值相关联,通过键就能访问与之相关联的数值。与键相关联的值可以是数字、字符串、列表乃至字典。事实上,可以将任何Python对象用作字典中的值。字典中的数据是准许修改的,它属于无序的可变序列。
例4-10 字典

键值对是两个相关联的值。有了特定数据的键时,Python顺藤摸瓜就能找到与之相对应的数值。键和数值之间用冒号分隔,而每个键值对之间用“,”分割。在字典中,键值对的数量没有限制,我们想存储多少个键值对都可以。
字典的特征如下。
1)字典中的数据必须是以键值对的形式出现。
2)逻辑上讲,键是不能重复的,而值是可以重复的。
3)字典中的键是不可以变的,也就是无法修改,而数值是可以修改的。
4)字典中的键和值不能脱离对方而存在。
4.5.2 字典的基本操作
字典类型是Python中唯一的映射类型,其基本操作包括增、删、改、查等。
1.添加键值对
字典是一种动态结构,可以随时在其中添加键值对,添加时需要依次指定字典名、输入键和相关联的数值。
例4-11 添加字典元素


这段代码先定义了字典的内容'name': '小明',它只包括一对键值映射。然后在这个字典中新增了三个键值对,键为age,数值为15;键为class,数值为2;键为score,数值为80,最后显示修改后的字典内容。
2.创建空字典
定义空字典很方便,只需要一个括号{}就可以了。编写程序的时候,可先使用一堆空括号定义一个字典,再逐步添加各个键值对。
例4-12 空字典

这里首先定义了一个空字典member,并逐步添加姓名和年龄等数据。
3.修改字典中的值
修改字典中的数值其实是一种键和数值对应关系的重组。比如,想修改例4-12中小张的年纪。
例4-13 修改字典的元素

字典member只包括键值name和键值age,我们将与键age相关联的数值改为19。输出表明,小张的年纪age变成了19。
4.删除字典中的数值
对于字典中不再需要的信息,可使用del语句将相应的键值对彻底删除。使用del语句时,必须指定字典名和要删除的键。
例4-14 删除字典键值

这样键值对age永远地消失了。另外,还有一种clear()方法可以清除所有的元素。
例4-15 清除字典所有元素

例4-16 判断字典中元素是否存在

例4-17 获取字典中所有键值

总结,keys()函数可以获取字典中所有的键;values()函数可以获取所有的数值;item()函数,则可以获取所有的键和数值。
小白逆袭:字典元素的顺序
在Python 3.5版本之前,字典是不能保证顺序的。比如,键值对A先插入字典,键值对B后插入字典,但是当我们打印字典的keys列表时,我们会发现B可能在A的前面。但是从Python 3.6开始,字典是变成有顺序的了。我们先插入键值对A,后插入键值对B,那么当我们打印keys列表的时候,我们就会发现B在A的后面。