一:字典的概念
字典是“键值对”的无序可变序列,字典中的每个元素都是一个“键值对”,包含键对象和值对象,可以通过“键对象”实现快速获取,删除,更新对应的“值对象”。
“键”是任意的不可改变数据
“值”可以是任意数据,并且可重复
一个字典的定义方式:a = {"name":"zhangsan","age":18,"height":1.75}
二:字典的创建
2.1 通过{},dict{}来创建字典对象
2.2 通过zip创建字典对象
2.3 通过fromkeys创建值为空的字典
三:字典元素的访问
3.1 通过key获取value,若key不存在,则抛出异常
3.2 通过get()方法获取value
推荐使用该方法,优点是:指定key不存在,返回None;也可以设置指定key不存在时默认返回的对象
3.3 列出所有的键值对
3.4 列出所有的key,列出所有的value
3.5 获取键值对的个数 len()
3.6 检测一个key是否存在
四:字典元素的增删改
4.1 增
4.2 改
使用update()将新字典中所有键值对全部添加到旧字典对象上,如果key有重复,则直接覆盖
4.3 删
1. delete()删除
2.clear()删除所有键值对
3.pop()删除指定键值对,并返回对应的值对象
popitem():随即删除和返回该键值对,字典是‘无序可变序列’,因此没有第一个元素,最后一个元素的概念;popitem 弹出随机的项,因为字典没有‘最后的元素’或其他哟管顺序的概念。若想一个接一个的移除并处理项,这个方法就非常有效(因为不用首先获取key的列表)
五:序列解包
5.1 概念
序列解包可以用于元组,列表,字典。序列解包可以让我们方便的对多个变量赋值
序列解包用于字典时,默认是对key进行操作;如果需要对键值对操作,则需要使用items();
如果需要对value操作,则需要使用values()
六:字典核心底层原理(重点)
字典对象的核心是散列表,散列表是一个稀疏数组(总是有空白元素的数组);数组的每个单元叫做bucket。每个bucket由两部分:一个是键对象的引用,一个是值对象的引用。
由于所有bucket结构和大小一致,我们可以通过偏移量来读取指定bucket
将一个键值对放进字典的底层过程
假设字典a创建完之后,数组长度为8:
我们要把 ‘name’ = 'zs' 这个键值对放进 a 中,第一步就需要计算key的散列值。Python可以通过hash()来计算
由于数组长度为8,我们可以拿计算出的散列值的最右边3位数字作为偏移量,即‘011’,十进制是3,我们查看偏移量3,对应的bucket是否为空,如果为空,则将键值对放进去,如果不为空,则依次取右边三位作为偏移量,即‘001’,十进制数字是1,再查看偏移量为1的bucket是否为空,直到找到为空的bucket将键值对放进去为止。
根据key查找‘键值对’的底层过程
当我们调用 a.get('name') 方法,就是根据key‘name’查找到‘键值对’,从而找到对象‘zs’
首先,仍然需要计算‘name’对象的散列表
算法和存储的底层流程算法一致,就不多赘述
七:用法总结
1.key必须可散列:
(1) 数字,字符串,元组都是可散列的
(2) 自定义对象需支持下面三点:
支持hash()函数
支持通过__eq__()方法检测相等性
若 a==b 为True,则hash(a)==hash(b)也为True
2.字典在内存中的开销巨大,典型的空间换时间
3.key查询速度很快
4.往字典里添加新建可能导致扩容,导致散列表中key的次序变化,因此,不要在遍历字典的同时进行字典的修改
网友评论