美文网首页
五:Python序列之字典

五:Python序列之字典

作者: 项啊丑 | 来源:发表于2020-03-28 22:41 被阅读0次

    一:字典的概念

    字典是“键值对”的无序可变序列,字典中的每个元素都是一个“键值对”,包含键对象和值对象,可以通过“键对象”实现快速获取,删除,更新对应的“值对象”。

    “键”是任意的不可改变数据

    “值”可以是任意数据,并且可重复

    一个字典的定义方式: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的次序变化,因此,不要在遍历字典的同时进行字典的修改

    相关文章

      网友评论

          本文标题:五:Python序列之字典

          本文链接:https://www.haomeiwen.com/subject/deteuhtx.html