Python 学习日记day 17

内容:字典用法总结,字典创建的底层逻辑

一、字典用法总结

1.键必须可散列

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

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

                   1.支持hash()函数

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

                   3.若a==b为真,则hash(a)==hash(b)也为真。

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

3.键查询速度很快

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

二、字典创建的底层逻辑

字典对象的核心是散列表

散列表:稀疏的数组(总是有空白元素),数组的每个单元叫bucket。每个bucket都有俩部分:一个是键对象的引用,另一个是值对象的引用.

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

KEY1Value1
KEY2Value2
KEY3Value3

创建一个空的字典a={}

假设字典长度为8即:


若想将“name”:“川川”插进去,会先对键“name”求一个哈希值的二进制:

print(bin(hash('name')))
 
#结果
0b111001010010100011001011000111110101001101000001101010101010011

为了找到一个特定的偏差值来代表“name”又由于该数组索引只有0-7八个数,所以哈希值从右往左取三位“011”即第3行,插入键和值。若第五行已被占用,则继续依次往左三位取值即“010”,以此类推。

 总结:

内容都是跟着老师讲课内容写的,基本没什么自己思考的地方,都是理论,重在理解,不过我觉得问题不是很大,毕竟在python中用的最多的还是列表。

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值