![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=1739114467-54LV7VTnkMD6lA0MYkrcpmJlnhgFKJfC-0-45f931cff9c188b5af54dc92c8790c49)
通过名字查找对应成绩,先在names中遍历找到所需查找的名字,再从scores中遍历取出对应的成绩,查找时间随着列表的长度增加。为了解决这个问题,Python提供了字典。字典(dict)在其他程序设计语言中称为映射(map),通过键值对(key-value)存储数据,键和值之间用冒号间隔,元素项之间用逗号间隔,整体用一对大括号“{”和“}”括起来。字典语法结构如下所示。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/46_01.jpg?sign=1739114467-naAXIqbri760OzoDVwqsR2y0q5LlErOm-0-05d8b194553d7408242639f03098d605)
字典有如下特性。
1)字典的值可以是任意数据类型,包括字符串、整数、对象,甚至字典。
2)键/值对用冒号分隔,而键值队用逗号分隔,所有这些都包括在花括号中。
3)键/值没有顺序。
4)键必须是唯一的,不允许同一个键重复出现,如果同一个键被赋值两次,后一个值会覆盖前面的值。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/46_02.jpg?sign=1739114467-sleMmI8f8Uu6KR2WmSSiYVfZNoeMzFGf-0-4a2df4f08e7fef5a25cbc0b0ba03a42d)
5)键必须不可变,只能使用数字、字符串或元组充当,不能用列表。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/46_03.jpg?sign=1739114467-K9GSECttAsLj5fAWY5nTTiggHQGiQURn-0-f23cb6fe462fbd32b10e46a8e20e2628)
【解析】因为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=1739114467-EOEAL6r2YGdneZ2fwyD8Jcs57L42vTI8-0-c9246134502017fd3ba3d3501537d68f)
3.4.2 字典操作
下面介绍字典元素的访问、删除、修改、增加等相关操作。
(1)访问字典元素
1)keys()方法返回一个包含所有键的列表。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/46_05.jpg?sign=1739114467-lFXj1SGPhxDNnGuZESxRObOrGxNYU2SU-0-a99d0b5c620f6d0a7366a98b23183396)
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/47_01.jpg?sign=1739114467-KkamWgD7ZepUwJGJHsnRdfb0qNciXqzy-0-ef054008144556abc19b013218c89bb6)
2)has_key()方法检查字典中是否存在某一键。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/47_02.jpg?sign=1739114467-zHxnuLxvDZCtQmWxn9IqsI8jfBhOVQwA-0-75f074e762361b88cebc6515245d0358)
3)values()方法返回一个包含所有值的列表。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/47_03.jpg?sign=1739114467-I3dBkFoaPynyN87n08LaLmEHZCIjIszt-0-8e0612fe8411ae14d87d0373b9d63904)
4)get()方法根据键返回值,如果输入的键不存在,返回None。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/47_04.jpg?sign=1739114467-eHcxTfY880ilMdKNLtTOnnDsk8dkUIRo-0-73583d4509042005e5d7c31d5ca35850)
5)items()方法返回一个形如(key , value)组成的元组。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/47_05.jpg?sign=1739114467-zPa04huVJOTk3iHjkfxiwGeUlxlJPzFD-0-d9b409ed34d4bb3855e4fae6113c7e63)
6)in运算用于判断某键是否在字典里,对于value值不适用。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/47_06.jpg?sign=1739114467-lxycrqgOkbZCIZ5KUpZb6HVcW7AV4Q9K-0-c2f0516dcc188fe280283e36d57737f5)
7)copy()方法复制字典。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/47_07.jpg?sign=1739114467-sYv2Y9VoSxMAevinFYpXANAn04KAc8OH-0-01dfaf4d9e01813b053a456babde722d)
(2)删除字典元素
1)del()方法允许使用键从字典中删除元素。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/47_08.jpg?sign=1739114467-dg82OoVe3sNAcLEGTGbUJJ6EKQzvTyPG-0-678b789c0b82e0cd728ba794126dde17)
2)clear()方法清除字典中所有元素。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/47_09.jpg?sign=1739114467-iGvh0jfXMX1ETPeZmk65wdGZ8il3EJKx-0-71ca871b715a4bf6830318d60f41bb2d)
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/48_01.jpg?sign=1739114467-r7hl4wYimCa2oflsLA9Mb3t9UIMRPR4h-0-16ca8cfa897a8b25c0784fad45e8a912)
3)pop()方法删除一个关键字并返回它的值。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/48_02.jpg?sign=1739114467-WW6z52s5kOHVt8z2QNUyvcC2n98heXp3-0-731993f7bd7f14f2048073a203698d65)
(3)修改字典元素
update方法类似于合并,把一个字典的键和值合并到另一个字典,覆盖相同键的值。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/48_03.jpg?sign=1739114467-iNvcOGSuBkvgDg5PcOeozFt1hPtTuThn-0-9e81528aa68dadb8d448c6367e0b9ac6)
(4)增加字典元素
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/48_04.jpg?sign=1739114467-tiRKVVkAGzHcgqS2ZXswihcy2MbWsx2a-0-ca49527bbe0c902e7b4e259af1636643)
字典方法如表3-4所示。
表3-4 字典方法
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/48_05.jpg?sign=1739114467-qzdziXh3AoqNrxKeNiuTenCxYC0d9Sr9-0-e10b774c93f8a8b6eaf3538168159615)