![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=1738907782-VrevPboIRjqNEIhNskHeIU31rgSqZ22P-0-f76aa2c53a7a5f0fdd381d4a018ea8ac)
通过名字查找对应成绩,先在names中遍历找到所需查找的名字,再从scores中遍历取出对应的成绩,查找时间随着列表的长度增加。为了解决这个问题,Python提供了字典。字典(dict)在其他程序设计语言中称为映射(map),通过键值对(key-value)存储数据,键和值之间用冒号间隔,元素项之间用逗号间隔,整体用一对大括号“{”和“}”括起来。字典语法结构如下所示。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/46_01.jpg?sign=1738907782-Fh8lrBKS2FUgU1xHFhTYml9nREJYxyOp-0-c8792913afb59005f3d36573c12c592f)
字典有如下特性。
1)字典的值可以是任意数据类型,包括字符串、整数、对象,甚至字典。
2)键/值对用冒号分隔,而键值队用逗号分隔,所有这些都包括在花括号中。
3)键/值没有顺序。
4)键必须是唯一的,不允许同一个键重复出现,如果同一个键被赋值两次,后一个值会覆盖前面的值。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/46_02.jpg?sign=1738907782-l2I2BQU0bn6pvmWpGQepmgfiLpKaY0Ww-0-fa68a9e87346263c48f5434b9a8bdb9c)
5)键必须不可变,只能使用数字、字符串或元组充当,不能用列表。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/46_03.jpg?sign=1738907782-016bdIFxOIb0s14RgCDseEs0FnNzXqE1-0-cca0b9c89a069a63ab852d3fa54de84e)
【解析】因为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=1738907782-D8B3xICvLdOVWU1S8Zzq765kg3Ph5R3n-0-81e0c7ff652700d060ba9b1d138b9176)
3.4.2 字典操作
下面介绍字典元素的访问、删除、修改、增加等相关操作。
(1)访问字典元素
1)keys()方法返回一个包含所有键的列表。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/46_05.jpg?sign=1738907782-28RIlbFNHCRSUt0xYW5cGg1ZPg2dfnxO-0-2154cc4a0a940034be2f3c595e18d9b4)
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/47_01.jpg?sign=1738907782-MIzSEv2OPINgKdjXXaOGSp3LEEk1gg0J-0-397a190ab2942d24f0bb85490c6f993d)
2)has_key()方法检查字典中是否存在某一键。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/47_02.jpg?sign=1738907782-KW1xPkhkoocJwXgJGgt1YZxjXpQLoY3F-0-d3fb29c50e19796076b3f928d5062e49)
3)values()方法返回一个包含所有值的列表。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/47_03.jpg?sign=1738907782-Dcr8DJvlNB0hJ9YKSzL8cwVwbsPGteFa-0-290fc2d0bd49b5dbe0a755eb56ad943d)
4)get()方法根据键返回值,如果输入的键不存在,返回None。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/47_04.jpg?sign=1738907782-yZV9am95GvgQdUUB6iSd2ob55y0jQE0f-0-db761b21ac10898b4ac6f1c121b5cca7)
5)items()方法返回一个形如(key , value)组成的元组。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/47_05.jpg?sign=1738907782-HLzhi4hCEb051nJ5P8uINHjKWfEkLpdX-0-d0f509fefba03c5afa56c5ff7b602795)
6)in运算用于判断某键是否在字典里,对于value值不适用。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/47_06.jpg?sign=1738907782-12SKkuxBQT1nfUugGsibNsXubGCVV0fi-0-e1694faa028a32de57b7645fe8f4923c)
7)copy()方法复制字典。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/47_07.jpg?sign=1738907782-GY923ETjPfrzzS1ZP8T3hz8xCSBGPWpn-0-0d66adb44a462ba41e96e0cb877772d7)
(2)删除字典元素
1)del()方法允许使用键从字典中删除元素。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/47_08.jpg?sign=1738907782-lpahnI8AmkzZLYrTDYTproPuR1PdP0lf-0-de4011f445f10861d4e728ce7d83d7c3)
2)clear()方法清除字典中所有元素。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/47_09.jpg?sign=1738907782-3qAME1v9SUEi7DK4ijD5Sz9WKPzoF99H-0-8a40466996d9b5b2a84195a4287e3f3e)
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/48_01.jpg?sign=1738907782-eN3DejXvGtySZzuHdZpFdgkA6elXd1ZI-0-b81011a43a2f52c770bc3ad8ab210c70)
3)pop()方法删除一个关键字并返回它的值。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/48_02.jpg?sign=1738907782-qtHA01ZneKdTfnCFffIhArrDbldXvmDG-0-c9f6cf56a5dd8e46196c09a5f1140ac6)
(3)修改字典元素
update方法类似于合并,把一个字典的键和值合并到另一个字典,覆盖相同键的值。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/48_03.jpg?sign=1738907782-xvNfkLgFHT5EFFolnK1mfskLnHGwkQga-0-5facafdf0ee4493333a785397d8f2a9a)
(4)增加字典元素
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/48_04.jpg?sign=1738907782-eyMfp7cG3y1kTADzklWejxisGxiWxUO5-0-16d97c83a234060798899118f47732fb)
字典方法如表3-4所示。
表3-4 字典方法
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/48_05.jpg?sign=1738907782-N8nhiEmiyBi8rTE4t24mOvtuElxfs5Sk-0-de384770228d3d5a3365872b586f9f9a)