![数据结构与算法(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=1739613676-UusYYoz0qgIRW5ZPkzXimNtuymU1I56c-0-a3baec2b83410a506c81b41855ebdbef)
通过名字查找对应成绩,先在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=1739613676-IrmLYEpz9Sye7WhLWV1acH3UNxz5pN5E-0-fdbbfddd339853dea279032f0df2b561)
字典有如下特性。
● 字典的值可以是任意数据类型,包括字符串、整数、对象,甚至字典等。
● 键值对没有顺序。
● 键必须是唯一的,不允许同一个键重复出现,如果同一个键被赋值两次,后一个值会覆盖前面的值。举例如下。
![](https://epubservercos.yuewen.com/3C8452/21889219301185006/epubprivate/OEBPS/Images/978-7-111-66363-8_52_03.jpg?sign=1739613676-fZnfCDmvrcTt3ymIlIxRAZCe7OBnnAbd-0-22e65670e67f2c6f9ac982f9ae2938f2)
● 键是不可变的,只能使用整数、字符串或元组充当,不能使用列表。
![](https://epubservercos.yuewen.com/3C8452/21889219301185006/epubprivate/OEBPS/Images/978-7-111-66363-8_52_04.jpg?sign=1739613676-QKw4ibIgK1EVYKdNIW8sVTAZtvXck9QG-0-6f6acee9d263e2425268e9dbe7d61d13)
【解析】因为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=1739613676-X2Q1LsnidNmqCYGxJPZlQtkAo9du7ctL-0-482b697d6747140f1ef576ab16460e9d)
3.9.2 字典的操作
下面介绍字典元素的访问、删除、修改和增加等相关操作。
(1)字典元素的访问
1)keys()方法返回一个包含所有键的列表。
![](https://epubservercos.yuewen.com/3C8452/21889219301185006/epubprivate/OEBPS/Images/978-7-111-66363-8_53_01.jpg?sign=1739613676-vtbV9UoPzFd4ENnUpKODOOnX4XTu1Jdw-0-c1dedbf516429c04cbc10ae1657f0b1b)
2)has_key()方法检查字典中是否存在某一键。
![](https://epubservercos.yuewen.com/3C8452/21889219301185006/epubprivate/OEBPS/Images/978-7-111-66363-8_53_02.jpg?sign=1739613676-FBJMffzDvynn0FDGHjXGIRfhuoZImZ58-0-a484d67e6cbe9a5cf03775eaaa72f621)
3)values()方法返回一个包含所有值的列表。
![](https://epubservercos.yuewen.com/3C8452/21889219301185006/epubprivate/OEBPS/Images/978-7-111-66363-8_53_03.jpg?sign=1739613676-ubHC0aG4m32r8rT9LEQygGOIavQznjHT-0-44ed04cc8176be3e5fba113708f16028)
4)get()方法根据键返回值,如果不存在则返回None。
![](https://epubservercos.yuewen.com/3C8452/21889219301185006/epubprivate/OEBPS/Images/978-7-111-66363-8_53_04.jpg?sign=1739613676-wD20PPcSTqw7rYyIkbwGKKA29cpB4DmN-0-e86d587478c43c66dc1bbf410614612b)
5)items()方法返回一个由(key,value)组成的元组。
![](https://epubservercos.yuewen.com/3C8452/21889219301185006/epubprivate/OEBPS/Images/978-7-111-66363-8_53_05.jpg?sign=1739613676-vDOotBckEjbB6r1zEmt9jV9vi9ntky8z-0-2912f54528c86abb63c193f6653e4ffb)
6)in运算用于判断某键是否在字典中,对于value值不适用。
![](https://epubservercos.yuewen.com/3C8452/21889219301185006/epubprivate/OEBPS/Images/978-7-111-66363-8_53_06.jpg?sign=1739613676-Rk3K4ytFHCgUbPiG0nJsctubRxmaYVGU-0-16de41cd36d65d06ea731b075231d373)
7)copy()方法复制字典。
![](https://epubservercos.yuewen.com/3C8452/21889219301185006/epubprivate/OEBPS/Images/978-7-111-66363-8_53_07.jpg?sign=1739613676-HDnduwnPKk2CWf3kBJksBULnWjvEMyME-0-b8b145632ada0de87516c461f17db4a7)
(2)字典元素的删除
1)del()方法允许使用键从字典中删除元素。
![](https://epubservercos.yuewen.com/3C8452/21889219301185006/epubprivate/OEBPS/Images/978-7-111-66363-8_53_08.jpg?sign=1739613676-IO27Mj7scql3sWIssy9r6br3MRWLkytm-0-e5f502c1344437ea5e4666fe763d1d80)
2)clear()方法清除字典中的所有元素。
![](https://epubservercos.yuewen.com/3C8452/21889219301185006/epubprivate/OEBPS/Images/978-7-111-66363-8_54_01.jpg?sign=1739613676-wpsU9l1Qqq9pbmdMmfaRIRJHxHhbmTF1-0-50df2a9f1989874cbf4b3e45b45edcb7)
3)pop()方法删除一个关键字并返回它的值。
![](https://epubservercos.yuewen.com/3C8452/21889219301185006/epubprivate/OEBPS/Images/978-7-111-66363-8_54_02.jpg?sign=1739613676-6P1ef6g9Q6M05dS1elBA1aw8um7gWCtY-0-e6eb4e492c63b1017541849f271b14e8)
(3)字典元素的修改
update()方法类似于合并,它把一个字典的键和值合并到另一个字典以覆盖相同键的值。
![](https://epubservercos.yuewen.com/3C8452/21889219301185006/epubprivate/OEBPS/Images/978-7-111-66363-8_54_03.jpg?sign=1739613676-eOOMqAbYXA7A0trIPpCjK5iyEhNSn9GE-0-c950aec107c0f765a346b626756c2907)
(4)字典元素的增加
![](https://epubservercos.yuewen.com/3C8452/21889219301185006/epubprivate/OEBPS/Images/978-7-111-66363-8_54_04.jpg?sign=1739613676-jzCjaoo4gptm5sGwMBhqDBPzb58Xzgew-0-a43da18c058d32a0662de00794fccd12)
字典方法如表3.13所示。
表3.13 字典方法
![](https://epubservercos.yuewen.com/3C8452/21889219301185006/epubprivate/OEBPS/Images/978-7-111-66363-8_54_05.jpg?sign=1739613676-OLgpb7Yx8CbYkfk1kMV0qSxsx5cKdDQU-0-af281bd72c51e24af10ce9b8f7a0c7aa)