![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=1739295359-zZytFQTbzu43mq21hMMXZtBbxnaTWULS-0-52b65c3a074ccb8823f895808f45b493)
通过名字查找对应成绩,先在names中遍历找到所需查找的名字,再从scores中遍历取出对应的成绩,查找时间随着列表的长度增加。为了解决这个问题,Python提供了字典。字典(dict)在其他程序设计语言中称为映射(map),通过键值对(key-value)存储数据,键和值之间用冒号间隔,元素项之间用逗号间隔,整体用一对大括号“{”和“}”括起来。字典语法结构如下所示。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/46_01.jpg?sign=1739295359-jlgncNrzfkXvZTNqbbpOTXfU2rAYPpWj-0-282080822f4dfdb7ab78492a7b68ae51)
字典有如下特性。
1)字典的值可以是任意数据类型,包括字符串、整数、对象,甚至字典。
2)键/值对用冒号分隔,而键值队用逗号分隔,所有这些都包括在花括号中。
3)键/值没有顺序。
4)键必须是唯一的,不允许同一个键重复出现,如果同一个键被赋值两次,后一个值会覆盖前面的值。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/46_02.jpg?sign=1739295359-7XIaGznNte7RrlaNkYBVsF1T17spI1ok-0-9757a76ca1414ff853c04eac6cc50cc5)
5)键必须不可变,只能使用数字、字符串或元组充当,不能用列表。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/46_03.jpg?sign=1739295359-v5RmTc6cv0WNsdfa7DOJB8179jYUrBur-0-86e09ac22b1dbeada10cf76ee2f1dd2f)
【解析】因为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=1739295359-rnaD2ajXEhLw4APwU1FiQJYfnx8Dy10g-0-1aa0f1a5b03b665cc4d6decbee341b49)
3.4.2 字典操作
下面介绍字典元素的访问、删除、修改、增加等相关操作。
(1)访问字典元素
1)keys()方法返回一个包含所有键的列表。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/46_05.jpg?sign=1739295359-Nj8d9g13RloEVoocuBECNFX1n63kGk6T-0-23a189c38411cedfe5371769c51598c0)
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/47_01.jpg?sign=1739295359-EOQIWIhwNzZ5hTFgh2Fi6ny4pqZGSIt3-0-8e41f4cf47341e14761e74b334600064)
2)has_key()方法检查字典中是否存在某一键。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/47_02.jpg?sign=1739295359-bgYQ9FJL5PbdxRsYY97FfMDRaTcvnjU0-0-4b467621e5f2eef3d0572693cea10bf8)
3)values()方法返回一个包含所有值的列表。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/47_03.jpg?sign=1739295359-QlTbWPdxI23pJlvA6znbTfrmI2tTXWSo-0-abd068fd7bffb8712262db96f5e666c8)
4)get()方法根据键返回值,如果输入的键不存在,返回None。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/47_04.jpg?sign=1739295359-CJ7GAMQDS20CxsasvaneFiiuKb8o1dfE-0-b9d6f8f4583912957184097f23e16d0d)
5)items()方法返回一个形如(key , value)组成的元组。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/47_05.jpg?sign=1739295359-14U4BweR5l2yQoXRUvQdBBNuXCNsuXou-0-c28c1790d444e1944bad0329287963d3)
6)in运算用于判断某键是否在字典里,对于value值不适用。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/47_06.jpg?sign=1739295359-i1qTi3nTHZFcrMQYdw3fVaHJuoQ3JpS4-0-dfcaf5769be77ea44f581dbf273fd058)
7)copy()方法复制字典。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/47_07.jpg?sign=1739295359-pVQNm4SozNziIgpHt5kMHyxdQHb7c12q-0-9b1df4af5186ec9932d0333116a08f1e)
(2)删除字典元素
1)del()方法允许使用键从字典中删除元素。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/47_08.jpg?sign=1739295359-1ChZ9lRn0iVU40JuUzkb1XqjgxuSlJgI-0-2ac314d82e9240209399dbd2f895af81)
2)clear()方法清除字典中所有元素。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/47_09.jpg?sign=1739295359-OQvizzmCZUTkkd0cEDTjvBW163tcaocs-0-23cd0517dbee9ee9c405e91b4267aae5)
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/48_01.jpg?sign=1739295359-gh30fj13B6nzWXDIWOOo4bnrDQdDAfls-0-b24370391670d9bb37a9fb0cb8820fb6)
3)pop()方法删除一个关键字并返回它的值。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/48_02.jpg?sign=1739295359-LhsylhrzJvXqJZgjuhtNe2Nrawt5bU9K-0-a1f1e2ace646a58a7f6f85977ad84b66)
(3)修改字典元素
update方法类似于合并,把一个字典的键和值合并到另一个字典,覆盖相同键的值。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/48_03.jpg?sign=1739295359-hx1qtT2N5h4S28o054SVGGjpkuqSQdqo-0-4d12055392fadcfb0aa6af000814c4a5)
(4)增加字典元素
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/48_04.jpg?sign=1739295359-huKY3TlGqldgCwaJIbV7lM6WsPykpkpG-0-9952299657995d22375a9b9cdb631136)
字典方法如表3-4所示。
表3-4 字典方法
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/48_05.jpg?sign=1739295359-O8F2X3p7Afy7q6KqQyfiJnRkXuJneiD4-0-56a7529f6034c8b58a84dd41caff70a5)