![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=1739689154-w840WMBfy8m4TUTGQg1EMk6fQ6d6CUa8-0-ba2923709af773dacc34e37718841f68)
通过名字查找对应成绩,先在names中遍历找到所需查找的名字,再从scores中遍历取出对应的成绩,查找时间随着列表的长度增加。为了解决这个问题,Python提供了字典。字典(dict)在其他程序设计语言中称为映射(map),通过键值对(key-value)存储数据,键和值之间用冒号间隔,元素项之间用逗号间隔,整体用一对大括号“{”和“}”括起来。字典语法结构如下所示。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/46_01.jpg?sign=1739689154-gwFBnDD3OmwJPUvgK6HdEmydCXwKr0ZG-0-6cb352b186b63f3671d2c655ccfbab19)
字典有如下特性。
1)字典的值可以是任意数据类型,包括字符串、整数、对象,甚至字典。
2)键/值对用冒号分隔,而键值队用逗号分隔,所有这些都包括在花括号中。
3)键/值没有顺序。
4)键必须是唯一的,不允许同一个键重复出现,如果同一个键被赋值两次,后一个值会覆盖前面的值。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/46_02.jpg?sign=1739689154-uHK3POtQFBKHox2qjjdUSjBwRrhDbQZe-0-7963805edcf10611f5523bc08cc929d7)
5)键必须不可变,只能使用数字、字符串或元组充当,不能用列表。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/46_03.jpg?sign=1739689154-N7ShHrrpQ0H7i7npI3brQpJggedWS3gd-0-3148ded7047e050e177af675acbfa91f)
【解析】因为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=1739689154-7bCPMwwDXW06drMs0eYvSslNqkRiWLJx-0-6e3e5990a6eaf246aead3136b6df6fc7)
3.4.2 字典操作
下面介绍字典元素的访问、删除、修改、增加等相关操作。
(1)访问字典元素
1)keys()方法返回一个包含所有键的列表。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/46_05.jpg?sign=1739689154-kqQsgeQzMq0wPCtww7mhCv4XptA8UmZ4-0-aa4a7173f9682a829ca17f9ed50d04f4)
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/47_01.jpg?sign=1739689154-huv5pVdl6MAnevVivYwarz9MLJPGhUa3-0-1db91e8b3ea23ef8ebaf5f5ea44c55df)
2)has_key()方法检查字典中是否存在某一键。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/47_02.jpg?sign=1739689154-Tu9jSwzofxjt3KWL8TuycL1dWF4hKanO-0-11664f5fcb58aec320fd5ff6d6a1fae4)
3)values()方法返回一个包含所有值的列表。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/47_03.jpg?sign=1739689154-zcwKG0NnfmpEu7R1RxbItieK4DYCuoeG-0-17b9e752dc425ef370433bd54f931e17)
4)get()方法根据键返回值,如果输入的键不存在,返回None。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/47_04.jpg?sign=1739689154-wZmBEu78NMOcg4UZayAIMrns4SEphh1h-0-ae591d71f55943cfcd9b8b1b125b6ed5)
5)items()方法返回一个形如(key , value)组成的元组。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/47_05.jpg?sign=1739689154-lmuwxqTqCNAd7p9ukJpbQ4YpkvfXYcyD-0-0dc22e0c6e059e9071f2635607e17674)
6)in运算用于判断某键是否在字典里,对于value值不适用。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/47_06.jpg?sign=1739689154-cDT4cmdweFIdzOkuMIkGGtALHcrleGlk-0-fb70b8b8c107102618ff803a4074f160)
7)copy()方法复制字典。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/47_07.jpg?sign=1739689154-Zs4rSh23hB0IUtkuVLijkXsNHxSrHsRc-0-af0c89951c83ee037b1dfeefd6c966b4)
(2)删除字典元素
1)del()方法允许使用键从字典中删除元素。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/47_08.jpg?sign=1739689154-ukLBR4rE3E7zQ1LAKmarK7GMqYiECujM-0-4d2619d5772c946d97675d261f0401c3)
2)clear()方法清除字典中所有元素。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/47_09.jpg?sign=1739689154-MXz9kaEPf5uaCMZj16QbcwRTSdbSvrhJ-0-19b4576b41f2b2719b1da6e83ccd6701)
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/48_01.jpg?sign=1739689154-sUGvPWQUJNzQHVyJ0rpO4EpZ54yq9myV-0-5c71e882197353460206ba1a941f61ac)
3)pop()方法删除一个关键字并返回它的值。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/48_02.jpg?sign=1739689154-f3oT3asfPzyGQlh8BsXNyA9H6NQD1WOQ-0-bf3ab61d635921a730b95a0590a46db7)
(3)修改字典元素
update方法类似于合并,把一个字典的键和值合并到另一个字典,覆盖相同键的值。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/48_03.jpg?sign=1739689154-E8qF76iK5MNOse2z0eu1bIIOjmD6QUDK-0-c084bc60fdfbbcf3721f19f509f91b9a)
(4)增加字典元素
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/48_04.jpg?sign=1739689154-1K0ulQvhBeOxwsCtEPbUyOD1UFHPYn3L-0-179911d67082a838c9e1ca692e84c64f)
字典方法如表3-4所示。
表3-4 字典方法
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/48_05.jpg?sign=1739689154-u4rilRby1GHRG0YUvdcKOk0dEHGx7AEp-0-76a49f76374fbfaa50153c8ab8b47daf)