list python 访问 键值对_哈希结构的python实现

哈希函数是哈希结构的重要组成部分,一个好的哈希函数可以提高查询的效率。在python中有两个数据结构是哈希结构实现的,分别是set集合和dict字典。那么这篇文章主要想带大家实现一个简单的字典的结构,也就是hashmap,这个数据结构是由一个个的键值对(k,v)组成。

假定k,v都是int的整数类型,哈希函数我们使用最经典的取模运算

对于哈希函数会存在key取模后值相同的这种情况,处理办法就是我们采用python自带的数据结构list来线性存储值相同的value

注:由于我们要实现字典的功能,所以存储key,value的数据结构需要我们自己来实现

实现hashmap的组件

对于hashmap这个数据结构,常用方法就是增删改查,具体的实现方法就是对应get(),put(),delete()这个三个函数,我们假定哈希函数为key%1000,存储kv键值对的数据结构如下:

[ [] for i in range(1000) ]

初始化一个包含有1000个空list的二维list,其中空的list中存放的就是含有键值对的对象

键值对的对象代码如图

73ceaccf1951980c4319a692a6b5dfec.png

这个对象需要具备获取key的值(getKey()这个方法),更新key的值(setKey()这个方法),获取value的值(getValue()这个方法),更新value的值(setValue()这个方法),在线性的list中存放的就是Dic这个对象,通过Dic这个对象来实现键值对的增删改查

在基础的元数据结构准备好之后,我们可以开始hashmap的接口(get,put,delete)的实现

  • put()方法
7600246a0267fd6c2c8c9af81ada2f63.png

如图,hashmap就是初始化好的二维list,通过k的哈希运算(self.mod)得出这个键值对存放的位置,如果bucket为空,说明这个list之前还没有放入元素,那么就可以就直接将生成的dic对象append到bucket中。如果bucket不为空,那么我们就开始遍历整个的bucket列表,如果k之前已经存在bucket中那么就直接更新value的值,当bucket中存在-1的key值,那么说明之前这个位置的dic已经被删除,可以将新的dic覆盖更新到已经删除的这个位置上。如果bucket中没有-1的key并且也没有与dic的相等的key,这个时候就将dic直接append到bucket中就可以了

  • get()方法
78a1d468981c813e60d36dc3cf382758.png

对于get方法,同理先将获取到的k进行哈希运算得到存放dic的位置,然后遍历bucket,如果存在与k相等的key,通过getValue()返回获取的值,如果遍历完成也没有与k相等的key,说明之前没有存放这个k,返回-1

  • delete()方法
2a416961978c1546aac9dbd4b32efaf7.png

delete删除方法的实现,本质上没有将dic对象从list中移除,而是将dic的key值置为-1,这样新的元素遇到删除的位置可以直接覆盖使用,没有必要在遍历到bucket的最后端去开辟一个新的内存空间存放dic元素

由于篇幅的原因,想看完整代码的读者可以咨询作者,欢迎大家关注桓艺恒,一块学习讨论互联网的技术

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python中,键值对是字典的基本元素。每个键都与一个值相关联。这个键可以是任何可哈希的对象,比如数字、字符串、元组等。与键相关联的值可以是任何Python对象。可以使用字典来存储和访问键值对。 在使用字典时,可以通过键来访问相应的值。通过给定键的值,可以使用索引操作符(方括号)来访问字典中的值。例如,如果有一个字典对象a,其键为"name",可以使用a["name"]来获取与键"name"相对应的值。 除了访问键值对,还可以对字典进行删除操作。可以使用del关键字删除指定的键值对,也可以使用clear方法删除字典中的所有键值对。同时,可以使用pop方法删除指定的键值对,并返回被删除的值对象。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Python 字典(键值对)](https://blog.csdn.net/I_can_move_you/article/details/118072152)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [十二.Python中的字典dict(键值对)以及存储原理](https://blog.csdn.net/qq_31840023/article/details/90381879)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值