python字典属于无序序列_五:Python序列之字典

一:字典的概念

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

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

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

一个字典的定义方式:a = {"name":"zhangsan","age":18,"height":1.75}

二:字典的创建

2.1 通过{},dict{}来创建字典对象

85c37d7b93fc

2.2 通过zip创建字典对象

85c37d7b93fc

2.3 通过fromkeys创建值为空的字典

85c37d7b93fc

三:字典元素的访问

3.1 通过key获取value,若key不存在,则抛出异常

85c37d7b93fc

3.2 通过get()方法获取value

推荐使用该方法,优点是:指定key不存在,返回None;也可以设置指定key不存在时默认返回的对象

85c37d7b93fc

3.3 列出所有的键值对

85c37d7b93fc

3.4 列出所有的key,列出所有的value

85c37d7b93fc

3.5 获取键值对的个数 len()

85c37d7b93fc

3.6 检测一个key是否存在

85c37d7b93fc

四:字典元素的增删改

4.1 增

85c37d7b93fc

4.2 改

使用update()将新字典中所有键值对全部添加到旧字典对象上,如果key有重复,则直接覆盖

85c37d7b93fc

4.3 删

1. delete()删除

2.clear()删除所有键值对

3.pop()删除指定键值对,并返回对应的值对象

85c37d7b93fc

popitem():随即删除和返回该键值对,字典是‘无序可变序列’,因此没有第一个元素,最后一个元素的概念;popitem 弹出随机的项,因为字典没有‘最后的元素’或其他哟管顺序的概念。若想一个接一个的移除并处理项,这个方法就非常有效(因为不用首先获取key的列表)

85c37d7b93fc

五:序列解包

5.1 概念

序列解包可以用于元组,列表,字典。序列解包可以让我们方便的对多个变量赋值

85c37d7b93fc

序列解包用于字典时,默认是对key进行操作;如果需要对键值对操作,则需要使用items();

如果需要对value操作,则需要使用values()

85c37d7b93fc

六:字典核心底层原理(重点)

字典对象的核心是散列表,散列表是一个稀疏数组(总是有空白元素的数组);数组的每个单元叫做bucket。每个bucket由两部分:一个是键对象的引用,一个是值对象的引用。

由于所有bucket结构和大小一致,我们可以通过偏移量来读取指定bucket

85c37d7b93fc

将一个键值对放进字典的底层过程

85c37d7b93fc

假设字典a创建完之后,数组长度为8:

85c37d7b93fc

我们要把 ‘name’ = 'zs' 这个键值对放进 a 中,第一步就需要计算key的散列值。Python可以通过hash()来计算

85c37d7b93fc

由于数组长度为8,我们可以拿计算出的散列值的最右边3位数字作为偏移量,即‘011’,十进制是3,我们查看偏移量3,对应的bucket是否为空,如果为空,则将键值对放进去,如果不为空,则依次取右边三位作为偏移量,即‘001’,十进制数字是1,再查看偏移量为1的bucket是否为空,直到找到为空的bucket将键值对放进去为止。

85c37d7b93fc

根据key查找‘键值对’的底层过程

85c37d7b93fc

当我们调用 a.get('name')方法,就是根据key‘name’查找到‘键值对’,从而找到对象‘zs’

首先,仍然需要计算‘name’对象的散列表

85c37d7b93fc

算法和存储的底层流程算法一致,就不多赘述

85c37d7b93fc

七:用法总结

1.key必须可散列:

(1) 数字,字符串,元组都是可散列的

(2) 自定义对象需支持下面三点:

支持hash()函数

支持通过__eq__()方法检测相等性

若 a==b 为True,则hash(a)==hash(b)也为True

2.字典在内存中的开销巨大,典型的空间换时间

3.key查询速度很快

4.往字典里添加新建可能导致扩容,导致散列表中key的次序变化,因此,不要在遍历字典的同时进行字典的修改

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值