![数据结构与算法(Python版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/974/41864974/b_41864974.jpg)
3.9 字典
3.9.1 字典的概念
【例3-14】根据同学的名字查找对应的成绩。
【解析】采用列表实现,则需要names和scores两个列表,并且列表中元素的次序一一对应,如zhou对应95,Bob对应75等,如下所示。
![](https://epubservercos.yuewen.com/3C8452/21889219301185006/epubprivate/OEBPS/Images/978-7-111-66363-8_52_01.jpg?sign=1734416027-FmzI9fTzDqm3O6cdhukncqe6wvBVt3dm-0-eb4c2b53880292f18ebba97c1ef51b37)
通过名字查找对应成绩,先在names中遍历查找的名字,再从scores中遍历对应的成绩,查找时间会随着列表的长度的增加而增加。为了解决这个问题,Python提供了字典。
字典(Dict)在其他程序设计语言中称为映射(Map),通过键值对(Key-Value)存储数据,键和值之间用冒号间隔,元素项之间用逗号间隔,整体用一对大括号“{}”括起来。字典语法结构如下所示。
![](https://epubservercos.yuewen.com/3C8452/21889219301185006/epubprivate/OEBPS/Images/978-7-111-66363-8_52_02.jpg?sign=1734416027-tcLo60IwJPu8eM8XFPBirpIMhBCS6V7m-0-b54f56034471d7ed82afefa00a6a00c2)
字典有如下特性。
● 字典的值可以是任意数据类型,包括字符串、整数、对象,甚至字典等。
● 键值对没有顺序。
● 键必须是唯一的,不允许同一个键重复出现,如果同一个键被赋值两次,后一个值会覆盖前面的值。举例如下。
![](https://epubservercos.yuewen.com/3C8452/21889219301185006/epubprivate/OEBPS/Images/978-7-111-66363-8_52_03.jpg?sign=1734416027-iAgM25EEMBuRvrK9CtOGEzzpGWyGCJfE-0-4132494e2b7764d59202e8897a66b6d5)
● 键是不可变的,只能使用整数、字符串或元组充当,不能使用列表。
![](https://epubservercos.yuewen.com/3C8452/21889219301185006/epubprivate/OEBPS/Images/978-7-111-66363-8_52_04.jpg?sign=1734416027-xinYjvPLDGrh3aKUnE6kBRc9PjU7aKbl-0-d072e4191b171fdd43eacbc2c7ac417e)
【解析】因为dict根据Key来计算Value的存储位置,在Python中,字符串、整数等都是不可变的,而list是可变的,因此,list不能作为Key。
字典与列表相比,有以下几个特点。
● 字典用空间来换取时间,其查找和插入的速度极快。
● 字典需要占用大量的内存,内存浪费较多。
● 字典是无序的对象集合,字典中的元素是通过键来存取的,而不是通过偏移存取。
采用字典实现上面的例子,则只需创建“名字”-“成绩”的键值对,便可直接通过名字查找成绩。字典实现代码如下。
![](https://epubservercos.yuewen.com/3C8452/21889219301185006/epubprivate/OEBPS/Images/978-7-111-66363-8_52_05.jpg?sign=1734416027-tP7L0OXVWShIJ3IyctFAox5XGghdrKkG-0-ab678279f8395835799d1e2bccb6ba23)
3.9.2 字典的操作
下面介绍字典元素的访问、删除、修改和增加等相关操作。
(1)字典元素的访问
1)keys()方法返回一个包含所有键的列表。
![](https://epubservercos.yuewen.com/3C8452/21889219301185006/epubprivate/OEBPS/Images/978-7-111-66363-8_53_01.jpg?sign=1734416027-ZuxEumpdPDeOdfUHDHzLw2BvakbrX1bj-0-6afe34b00504cf3995a6cd323553a21f)
2)has_key()方法检查字典中是否存在某一键。
![](https://epubservercos.yuewen.com/3C8452/21889219301185006/epubprivate/OEBPS/Images/978-7-111-66363-8_53_02.jpg?sign=1734416027-okL8cBAt3Ny0VgNU7KJOIC52jtyQDg4s-0-d483caa2b4e65c90fb54d2706beacf8c)
3)values()方法返回一个包含所有值的列表。
![](https://epubservercos.yuewen.com/3C8452/21889219301185006/epubprivate/OEBPS/Images/978-7-111-66363-8_53_03.jpg?sign=1734416027-0ka16eVx73eXvXcVv3datMhtWk2dXlil-0-eae6a6f34e258f1d80e2c568456758b7)
4)get()方法根据键返回值,如果不存在则返回None。
![](https://epubservercos.yuewen.com/3C8452/21889219301185006/epubprivate/OEBPS/Images/978-7-111-66363-8_53_04.jpg?sign=1734416027-b9cUUoG5bKJC6F0AkO6uzMgUvPeIALhR-0-fad652c7909337c04ea143b9f970d1a5)
5)items()方法返回一个由(key,value)组成的元组。
![](https://epubservercos.yuewen.com/3C8452/21889219301185006/epubprivate/OEBPS/Images/978-7-111-66363-8_53_05.jpg?sign=1734416027-BROU5NPut6BQBwjSdLvyJz1XENQto2ih-0-d9431f99382b3ef3757ce01ae64d5e12)
6)in运算用于判断某键是否在字典中,对于value值不适用。
![](https://epubservercos.yuewen.com/3C8452/21889219301185006/epubprivate/OEBPS/Images/978-7-111-66363-8_53_06.jpg?sign=1734416027-upe6zpwUGGe8afqI7GXPOttNdyFYnd8O-0-b1e9ff2f0e8842d2d5b9227f19d4011f)
7)copy()方法复制字典。
![](https://epubservercos.yuewen.com/3C8452/21889219301185006/epubprivate/OEBPS/Images/978-7-111-66363-8_53_07.jpg?sign=1734416027-oiJSTiUtafoz0RrAQN1NdDe991zlXUA1-0-426c97b58bcfb9455ddcc23e9c4b5355)
(2)字典元素的删除
1)del()方法允许使用键从字典中删除元素。
![](https://epubservercos.yuewen.com/3C8452/21889219301185006/epubprivate/OEBPS/Images/978-7-111-66363-8_53_08.jpg?sign=1734416027-AeP7zZJmoRyTqbu8wR0KB51AxSUJtLXH-0-6248d1c64367ff5e79d8fbef7f2a1697)
2)clear()方法清除字典中的所有元素。
![](https://epubservercos.yuewen.com/3C8452/21889219301185006/epubprivate/OEBPS/Images/978-7-111-66363-8_54_01.jpg?sign=1734416027-h5CxeCa3uXnRjb0BbPk3mmX4qViqwpQj-0-b9c51d8e3c669c367684b45f0ee0a377)
3)pop()方法删除一个关键字并返回它的值。
![](https://epubservercos.yuewen.com/3C8452/21889219301185006/epubprivate/OEBPS/Images/978-7-111-66363-8_54_02.jpg?sign=1734416027-9nyRfDUYqrtuZscA8HWuA6Jx94lqTSnc-0-bd91325f3cf18409724492b6f97cbe1b)
(3)字典元素的修改
update()方法类似于合并,它把一个字典的键和值合并到另一个字典以覆盖相同键的值。
![](https://epubservercos.yuewen.com/3C8452/21889219301185006/epubprivate/OEBPS/Images/978-7-111-66363-8_54_03.jpg?sign=1734416027-F3ULrO6fX5jGRBph9sWUD7NM3B4hBpXM-0-b29c283a30cade149996a8fc9e4d3074)
(4)字典元素的增加
![](https://epubservercos.yuewen.com/3C8452/21889219301185006/epubprivate/OEBPS/Images/978-7-111-66363-8_54_04.jpg?sign=1734416027-buG3blk8dxKYOUHAccH6cTcyLZO9Yr55-0-3ebecc8189622f6f0c0fcd510c41947f)
字典方法如表3.13所示。
表3.13 字典方法
![](https://epubservercos.yuewen.com/3C8452/21889219301185006/epubprivate/OEBPS/Images/978-7-111-66363-8_54_05.jpg?sign=1734416027-H2QrAhllJyj4IAx0EEIr6LJ1ZvrAX00A-0-147dc2e26caa59f2b613c2633f4ff1be)