【第六课】Python字典入门2022.7.1

学习内容:

字典:键值对、无序可变
可以通过“键对象”实现快速获取、删除、更新对应的“值对象”。
“键”是任意的不可变数据:如整数、浮点数、字符串、元组;
列表、字典、集合这些可变对象不可以作为“键”;
“键”不可重复。
“值”可以是任意的数据,可以重复。

一、字典的创建

1.{}或者dict()

a = {‘name’:‘msy’, ‘age’:24, ‘job’:‘test’}
b = dict( name = ‘msy’, age = 24, job = ‘test’)
c = dict([(“name”,‘msy’), (‘age’,18)])

2.zip()

d = [‘name’, ‘age’, ‘job’]
e = [‘msy’, 24, ‘test’]
x = dict(zip(d,e))

3.fromkeys()创建值为空的字典

f = dict.fromkeys([‘name’, ‘age’, ‘job’])

二、字典元素的访问

1.“键”得到“值”

若键不存在,则抛出异常。

a[‘name’]

2.get() 获得“值”

优点:指定键不存在,返回None;或设置默认返回的对象。

a.get(‘sex’,‘该键对象不存在’)

3.列出所有键值对

a.items()

4.列出所有键,或值

a.keys()
a.values()

5.len()键值对的个数

6.检测“键”是否在字典中

‘name’ in a

返回True或False

三、字典元素添加、修改、删除

1.添加元素

如果“键”已经存在,则覆盖旧的键值对;
如果“键”不存在,则新建键值对;

a[‘address’] = ‘上海’

2.update()添加字典

将新字典的所有键值对都添加到旧字典商,如有重复则直接覆盖。

a.update(b)

把b的新增到a上

3.del();clear();pop()

删除字典中的元素:del()
删除所有键值对:clear()
删除指定键值对,并返回对应的“值对象”:pop()

del(a[‘name’])
b = a.pop(‘age’)

4.popitem()

随机删除和返回键值对。
无序可变:没有第一个、最后一个元素的概念
可以用于依次弹出并移除处理项,非常有效

a.popitem()

四、序列解包

序列解包可以用于元组、列表、字典。
序列解包可以方便对多个变量赋值。

x,y,z =(10,20,30)
(x,y,z) =(10,20,30)
[x,y,z] =[10,20,30]

用于字典时,默认对“键”操作;
如果需要对“键值对”操作,用items();
如果需要对“值”操作,用values();

name,age,job = s
name

输出’name’

name,age,job = s.items()
name

输出( ‘name’ , ‘msy’ )

name,age,job = s.values()
name

输出’msy’

五、字典核心底层原理(重要)

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

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

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

创建一个字典a,数组长度假设为8,
把"name" = “msy” 这个键值对放到字典对象a中,
第一步,计算键“name”的散列值(Python中用hash()计算)

bin(hash(“name”))

得到散列值‘-0b1010111101001110110101100100101’

由于数组长度为8,可以用计算出的散列值的最右边3位(3位二进制可以表示0到7)作为偏移量,即“101”,表示十进制数字5,查看偏移量5对应的bucket是否为空。
如果为空,则放入键值对。
如果不为空,则依次取右边3位作为偏移量,即“100”,表示十进制数字4,查看偏移量4对应的bucket是否为空,直到找到为空的bucket键值对放进去。

扩容:如果数组的2/3已满,会自动扩容(8个到32个到64个等)

2.根据键查找“键值对”的底层过程

第一步,仍计算“name”对象的散列值;
和存储的底层流程算法一致,依次取散列值的不同位置的数字。假设数组长度为8,取散列值最右边3位数字作为偏移量,查看对应bucket:
如果为空,返回None;
如果不为空,计算这个bucket的“键对象”的散列值,和前面计算的散列值进行比较:
如果相等,则直接返回“值对象”;
如果不相等,再取几位数字计算偏移量,依次取完没有找到,则返回None。

用法总结:

  1. “键”必须可以散列
    1)数字、字符串、元组都可以散列;
    2)自定义对象需要支持以下三点:
    ①支持hash()函数
    ②支持通过__eq__()方法检测相等性
    ③若 a == b 为真,则hash(a) == hash(b)也为真

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

  3. 键查询速度很快

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值