![Python数据分析从小白到专家](https://wfqqreader-1252317822.image.myqcloud.com/cover/745/38209745/b_38209745.jpg)
3.2.3 Python的字典
字典是Python中的一种具有映射性质的数据类型,即由“键-值”(key-value)两部分构成,组成键-值对。早期,在C/C++中并没有这样的类型(直到C++有了STL,其中提供了map方法,不过Python的字典较C++的map更为实用、方便),只能使用哈希算法。“哈希”对应英文单词hash,意思为“散列”。
使用哈希算法可以避免遍历整个数组,同时可以计算输入的整数出现的次数。这样大大降低了复杂度。这个算法的含义是:当读入的数为x时,就令hashTable[x]=true(说明hashTable数组需要被初始化为false,表示初始状态下所有数都未出现过)。
“哈希”也分为键和值,在hashTable[x]=true中,x就是这个哈希的“键”(key),而布尔值true则是哈希的“值”(value),而Python的“字典”类型普遍被当作一种可变的哈希表来使用。字典不同于列表和元组,列表和元组是有序的,即序号值(index)从0~n-1有序排列;而字典是无序的,字典的键(key)可以是字符串,也可以是数字,它们之间不需要有任何联系,所以字典的键(key)完全是无序的。
前面提到,字典具有映射性质,“映射”是初等数学中常见的一个概念,即可以表达一种相对应的关系,可以是一对一、一对多,还可以是多对多。例如,一元一次函数是一条直线,所以x与y是一对一的关系;而一元二次函数是抛物线,是一对二(多)的关系;椭圆曲线不是“函数”,因为函数关系只能是一对多的,椭圆曲线是二对二(即多对多的范畴)的关系。下面来举一个例子,创建字典并对它赋值,可以直接给出键-值对,也可以使用内建方法fromkeys()和dict()来创建字典。
![](https://epubservercos.yuewen.com/ED1E6A/20118172701012106/epubprivate/OEBPS/Images/40923_47_2.jpg?sign=1739271971-hEWcbJ59RJmHsojTuU0VpgV3oZZhuWjz-0-b0c33f033ed5bd57e2cfb8c41b5f9aae)
![](https://epubservercos.yuewen.com/ED1E6A/20118172701012106/epubprivate/OEBPS/Images/40923_48_1.jpg?sign=1739271971-JnPTQ3bBpo0iJxfbgrjP35Z56JojCoCW-0-46d7793edcbf4b865867e27412e6cb16)
输出结果:
![](https://epubservercos.yuewen.com/ED1E6A/20118172701012106/epubprivate/OEBPS/Images/40923_48_2.jpg?sign=1739271971-AM3OqCitO02fMJ1N0241wNItu5lEvMHa-0-23a95e87ad9261f39d002daa8e387c4b)
那么如何通过遍历来读取字典里“键-值对”的“值”呢?一般查看“键-值对”的值都是通过键来实现的,所以可以通过遍历字典的键来取出它的值。当然,Python3支持直接遍历字典本身(实际上是用宏省去了键,本质并没有变),也可以通过某个键得到字典的值,示例如下:
![](https://epubservercos.yuewen.com/ED1E6A/20118172701012106/epubprivate/OEBPS/Images/40923_48_3.jpg?sign=1739271971-7fKsfnIjJ51X9BEW9gcRGU4zDLNtJ3jP-0-565694b3dad037f86bb796d8d382326c)
输出结果:
![](https://epubservercos.yuewen.com/ED1E6A/20118172701012106/epubprivate/OEBPS/Images/40923_49_1.jpg?sign=1739271971-MGyLANV4vItwT0WwbsfVD9rUBg3jrDmu-0-ed56bf3de19d1abb453d7495508df3ac)
由此可见,Python的字典是C/C++的哈希算法的极佳“替代品”,省去了程序员自己写算法的步骤,方便易用。当然,在使用第三种方法(直接通过字典的键来得到值)时,如果输错了“键”或者这个“键”根本不存在,就得不到正确的结果。过去可以用has_key()方法来判断某个键是否存在于某个字典中,但是has_key()方法已经被淘汰,有了更方便的方法,那就是in和not in,示例如下:
![](https://epubservercos.yuewen.com/ED1E6A/20118172701012106/epubprivate/OEBPS/Images/40923_49_2.jpg?sign=1739271971-B14DZ4RuE4uBAG7a1fWj9w02k3MQYtrR-0-315e2568c7a783769fb2b811f8ba7bf9)
输出结果:
![](https://epubservercos.yuewen.com/ED1E6A/20118172701012106/epubprivate/OEBPS/Images/40923_49_3.jpg?sign=1739271971-XwAYEyUfxe8eZ77i7cytgXaFOZweUgpu-0-1822247fa5f671118586034f33329af8)
字典不是元组,它支持通过“=”赋值符号更新字典的值,并且也支持用户使用del语句手动回收字典及其占用的内存空间。下面介绍Python对于字典类型定义的内建函数,内建函数有3个(第4个内建函数cmp在Python3中已被淘汰),分别为len()、str()、type(),如表3-5所示。
表3-5 Python字典的内建函数
![](https://epubservercos.yuewen.com/ED1E6A/20118172701012106/epubprivate/OEBPS/Images/40923_50_1.jpg?sign=1739271971-pLZEFU4bSVMPu3pJUoThFZUvU62wD4Q6-0-a8e2df33d383dd7ae3ba605d4de90ea0)
表3-5中的3个内建函数的示例如下:
![](https://epubservercos.yuewen.com/ED1E6A/20118172701012106/epubprivate/OEBPS/Images/40923_50_2.jpg?sign=1739271971-6QCD2VZ34a5l5CaDoZi9bEt2Yc64HuVS-0-366c83993f87bb3f08461978df4731ee)
输出结果:
![](https://epubservercos.yuewen.com/ED1E6A/20118172701012106/epubprivate/OEBPS/Images/40923_50_3.jpg?sign=1739271971-7eLiqz7M4ilpWfFT5g9v3yltAbqC7SbV-0-3fd0fd4a56c686687f5ab03e639a4c2c)
type()是一个常见的内建函数,基本所有类型的内建函数都有它的定义。当然,Python的字典还有其他内建函数,如表3-6所示。
表3-6 Python字典的其他内建函数
![](https://epubservercos.yuewen.com/ED1E6A/20118172701012106/epubprivate/OEBPS/Images/40923_50_4.jpg?sign=1739271971-7iPbTwMMj9pdpoE55nhRhlNDTCAH6xSI-0-29a90e55b9e7448e168c46c70c8a1ec2)
续表
![](https://epubservercos.yuewen.com/ED1E6A/20118172701012106/epubprivate/OEBPS/Images/40923_51_1.jpg?sign=1739271971-Co541XcSM7NwWBPuur6EmgCDuV7VRqYP-0-96c33fa42e7ed7e56475546603c10569)