![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=1739692006-RRU6SiUHP6OSRnes1wPHb8i6eTjWnmza-0-9d6d072f518db5227aa31427a7054ca4)
通过名字查找对应成绩,先在names中遍历找到所需查找的名字,再从scores中遍历取出对应的成绩,查找时间随着列表的长度增加。为了解决这个问题,Python提供了字典。字典(dict)在其他程序设计语言中称为映射(map),通过键值对(key-value)存储数据,键和值之间用冒号间隔,元素项之间用逗号间隔,整体用一对大括号“{”和“}”括起来。字典语法结构如下所示。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/46_01.jpg?sign=1739692006-LMvBpU104T0EcmzLM0civSorLXGprQwM-0-a56ac6a4eb3711243ab72147a881c35d)
字典有如下特性。
1)字典的值可以是任意数据类型,包括字符串、整数、对象,甚至字典。
2)键/值对用冒号分隔,而键值队用逗号分隔,所有这些都包括在花括号中。
3)键/值没有顺序。
4)键必须是唯一的,不允许同一个键重复出现,如果同一个键被赋值两次,后一个值会覆盖前面的值。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/46_02.jpg?sign=1739692006-tStDZuRJrutITn7THArIPtDyC2k2e34T-0-d43e8c85a5e6ab8ff25f5c44f4735471)
5)键必须不可变,只能使用数字、字符串或元组充当,不能用列表。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/46_03.jpg?sign=1739692006-w89mbyOJ58wxscAED3mgMJId2STRGNzq-0-3c1ecb3aa0bea47c9f157e03af4a3cc3)
【解析】因为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=1739692006-k1zJaHffFcWOmnPOrl8Dbwsb2adJCvUV-0-1cfc2664854ed736b242943002739986)
3.4.2 字典操作
下面介绍字典元素的访问、删除、修改、增加等相关操作。
(1)访问字典元素
1)keys()方法返回一个包含所有键的列表。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/46_05.jpg?sign=1739692006-bcFdFseAIj668sO3TkHhiBXBCfz42Xub-0-d33e351c5db942d96c63aebd4a9181ac)
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/47_01.jpg?sign=1739692006-DDB2NSOw7np1Ckh99kBHx8cGYGli83ax-0-d864b9b66d376c0cca90e8bed3fca5a9)
2)has_key()方法检查字典中是否存在某一键。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/47_02.jpg?sign=1739692006-WWOvwR9cxJhMNnZPOLE9hAcvihlI8dLG-0-51d822dfaea2edcd8e53f703f4966def)
3)values()方法返回一个包含所有值的列表。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/47_03.jpg?sign=1739692006-SmAobYfPT3OZ0kPfg2adJRQM6c7tqFny-0-b8272aa65ccefb0ba00aa9eed7e38b3c)
4)get()方法根据键返回值,如果输入的键不存在,返回None。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/47_04.jpg?sign=1739692006-P1hwcqHN8HLIvPr0AWFPuFVvpdGq2evl-0-778fda1072d478a4bb43fabc9f4554c6)
5)items()方法返回一个形如(key , value)组成的元组。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/47_05.jpg?sign=1739692006-RIgemz3L4oAZeJvAPwMVL0wLWtFTxKlC-0-e47698a5cad05c012c6d4255e6b9d9be)
6)in运算用于判断某键是否在字典里,对于value值不适用。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/47_06.jpg?sign=1739692006-S8aLhR9TlU6Cr9aEHTu6QWD14XB8eWIb-0-68dcfaf289bcf870633430eb92caccfa)
7)copy()方法复制字典。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/47_07.jpg?sign=1739692006-JSDSfYOOzZCCr7ND4cy2OplVbRsZu8w7-0-687757e0ea67a37621f44345131f45af)
(2)删除字典元素
1)del()方法允许使用键从字典中删除元素。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/47_08.jpg?sign=1739692006-cTqYtxN79ngjtXw5jwelEkoJ96PKl8Te-0-ce6ab076b92610b378d134922cde763f)
2)clear()方法清除字典中所有元素。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/47_09.jpg?sign=1739692006-md38QymSHkf6xrSxtIRMqQSFF1ehOG0r-0-f360891ded9285e333590972408e03b5)
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/48_01.jpg?sign=1739692006-DdvZ4m0dVftZFZw4rR4QCzJ325BvTar7-0-28335a6ef741b7620613a4b8b8abefdf)
3)pop()方法删除一个关键字并返回它的值。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/48_02.jpg?sign=1739692006-SUbfFVVHX12OvUkNRZbIAG8rvbnHZ3MQ-0-d1881bedd1436fa111accbfc813eae47)
(3)修改字典元素
update方法类似于合并,把一个字典的键和值合并到另一个字典,覆盖相同键的值。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/48_03.jpg?sign=1739692006-GDWHp5hsp6Zlzx6IXtK9yfymiMKc4uPS-0-97aa5137ef00821361080b38b38e1034)
(4)增加字典元素
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/48_04.jpg?sign=1739692006-2IGILWBUwJgOy7IhXaHsqZ1SlwNdAukp-0-da73e3267cd45add2fbd063012bb1bcd)
字典方法如表3-4所示。
表3-4 字典方法
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/48_05.jpg?sign=1739692006-m0OSGIQIVW2ipUqYfWN4y41Ob8wUlaLj-0-90b29bf637a111e03cbafc374ece5c23)