![Python 3程序设计基础](https://wfqqreader-1252317822.image.myqcloud.com/cover/971/33892971/b_33892971.jpg)
3.4 字典
本节介绍字典的概念以及字典的操作方法。
3.4.1 字典概念
【例3-14】 根据学生的名字查找对应的成绩。
【解析】采用列表实现,则需要names和scores两个列表,并且列表中元素的次序一一对应,例如zhou->95,Bob->75等,如下所示。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/45_05.jpg?sign=1739533485-hrBj8YCvkXFi78RLsA0Mr8HSiNWggmau-0-2da771caa29c394fd208619a6b2b6c5a)
通过名字查找对应成绩,先在names中遍历找到所需查找的名字,再从scores中遍历取出对应的成绩,查找时间随着列表的长度增加。为了解决这个问题,Python提供了字典。字典(dict)在其他程序设计语言中称为映射(map),通过键值对(key-value)存储数据,键和值之间用冒号间隔,元素项之间用逗号间隔,整体用一对大括号“{”和“}”括起来。字典语法结构如下所示。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/46_01.jpg?sign=1739533485-oDlDAP7qoU3d5tUc0kWdLAwDow0YhV6n-0-db706ed367a3dc0269b0bc076dff8779)
字典有如下特性。
1)字典的值可以是任意数据类型,包括字符串、整数、对象,甚至字典。
2)键/值对用冒号分隔,而键值队用逗号分隔,所有这些都包括在花括号中。
3)键/值没有顺序。
4)键必须是唯一的,不允许同一个键重复出现,如果同一个键被赋值两次,后一个值会覆盖前面的值。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/46_02.jpg?sign=1739533485-4xYUwGXoWtdM0ENML8c1fMsF9Z9TrfN8-0-38ac29d0d40cb575a585cf2d173641d9)
5)键必须不可变,只能使用数字、字符串或元组充当,不能用列表。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/46_03.jpg?sign=1739533485-gZtciegRKy2kQbYdglxrUm2vqEZuGzYr-0-600c2e66f77cd910fea1d4ccb04b3700)
【解析】因为dict根据key来计算value的存储位置,如果每次计算相同的key得出的结果不同,那dict内部就完全混乱了。这个通过key计算位置的算法称为哈希算法(Hash)。为了保证Hash的正确性,作为key的对象就不能变。在Python中,字符串、整数等都是不可变的,而list是可变的,因此,list不能作为key。
字典与列表比较,有以下几个特点。
1)查找和插入的速度极快,不会随着“键”的增加而增加。
2)占用大量的内存,内存浪费多。
3)值通过键存取,而不是通过偏移存取。
采用字典实现例3-14,则只需创建“名字”-“成绩”的键值对,便可直接通过名字查找成绩。字典实现代码如下。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/46_04.jpg?sign=1739533485-47J4QPArUw40uOfRlKSAPVlDEP8Tz3gk-0-7e76241328a4938217d510207d69224d)
3.4.2 字典操作
下面介绍字典元素的访问、删除、修改、增加等相关操作。
(1)访问字典元素
1)keys()方法返回一个包含所有键的列表。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/46_05.jpg?sign=1739533485-sO22w8SvhY6OeD9W3dhgIIqEOj3dmVOC-0-450baa3218ba19dfa26bd19e2c8218fe)
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/47_01.jpg?sign=1739533485-vMsFcmJwnrNSzU3fDt6Rvyt6NnIvq1J8-0-5ee1cc1e13e58ce7655576af0122023b)
2)has_key()方法检查字典中是否存在某一键。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/47_02.jpg?sign=1739533485-C2k60X9DwlTCYVFPsHzDCjRC3V8IgDhg-0-f686d06510db8cce9e9676b2e1f5ae96)
3)values()方法返回一个包含所有值的列表。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/47_03.jpg?sign=1739533485-Pas1Rag1LUxi6yezCJvUocj6FLy38MQE-0-28721c671169d1e4914df0bb10a4588a)
4)get()方法根据键返回值,如果输入的键不存在,返回None。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/47_04.jpg?sign=1739533485-MXLkVpz149yTOvnqWQpJmPpze5CRoJIT-0-8f524234bfd3d235beb849b7db31daf1)
5)items()方法返回一个形如(key , value)组成的元组。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/47_05.jpg?sign=1739533485-QuFRSCdEmNNdhJ1LJHyGefD2L2Mmv1K3-0-456daeccabb8a006910abf454b4bf589)
6)in运算用于判断某键是否在字典里,对于value值不适用。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/47_06.jpg?sign=1739533485-HHjmLnA7dlCgVhcvszr6y3mJA71pGOwJ-0-77475e438e5475249d486df4166d3ad0)
7)copy()方法复制字典。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/47_07.jpg?sign=1739533485-wXfxioBFByHw8A6wTiRHGhhSJaAp9hlV-0-8283268623466aeb9bae40d6544537ee)
(2)删除字典元素
1)del()方法允许使用键从字典中删除元素。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/47_08.jpg?sign=1739533485-XVgI588Gvd2nDiPeS3ptc2wiWLMTD0FT-0-408b7b3e650344336aeead46b0bee98d)
2)clear()方法清除字典中所有元素。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/47_09.jpg?sign=1739533485-kkucbXXXVsKFMSmnoIbvN2RtBf5Hr4ce-0-cace54631d4bef2ed43e52de66ce5ecb)
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/48_01.jpg?sign=1739533485-5yY96q75jHHPOht2HWJMQUZ65heSvodV-0-38101e07481de79693b5a166f35c8c96)
3)pop()方法删除一个关键字并返回它的值。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/48_02.jpg?sign=1739533485-gYCuWoQWTodke83CKr5ZZI4XqjmOSUcg-0-13da0cac8b7a44016fb23af9ae8041da)
(3)修改字典元素
update方法类似于合并,把一个字典的键和值合并到另一个字典,覆盖相同键的值。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/48_03.jpg?sign=1739533485-udqZ7yhCnjknFbedMp4guVBW3Pz1A19g-0-7bb8159ef7093bb28ab4edc07db75998)
(4)增加字典元素
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/48_04.jpg?sign=1739533485-GU0svCDR9JI7hIMtutBRwewmNFlXe6Nw-0-ca90d766b65db4fe45b8b6a6520d998b)
字典方法如表3-4所示。
表3-4 字典方法
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/48_05.jpg?sign=1739533485-LwcKCYwcerglCG4lpyZ2as9rOg4bg2X2-0-33f242ba7dfb0c0052d162c7a7fc5f72)