python利用拉链法实现字典方法示例

 更新时间:2017年03月25日 11:14:12   作者:escapist  
这篇文章主要介绍了python利用拉链法实现字典的方法,文中给出了详细的示例代码,相信对大家具有一定的参考价值,需要的朋友可以们下面来一起看看吧。

前言

字典也叫散列表,最大的特点是通过key来查找其对应的值其时间复杂度是O(1),下面这篇文章就来给大家介绍介绍python利用拉链法实现字典的方法。

在Python中怎样用列表实现字典?

用列表实现字典最大的问题就是解决hash冲突,如果在列表中通过计算不同的key得到相同的相同了位置,这时候应该怎么办?

最简单的办法就是使用拉链法.

拉链法:就是在一个列表中每个位置再添加一个列表,这样就算是有hash冲突也能够存储进去,当选取的hash函数足够好,

num的数足够大,就能够保证列表中的每一个列表里面只有一个元素。根据key计算的元素所在的位置,然后来取值就能达

到O(1)的时间。

方法示例

class MyDict:
 def __init__(self, num=100): # 指定列表大小
  self._num = num
  self._lst = []
  for _ in range(self._num):
   self._lst.append([])

 def update(self, key, value): # 添加 key-value
  key_index = hash(key) % self._num
  for i, (k, v) in enumerate(self._lst[key_index]):
   if key == k:
    self._lst[key_index][i] = [key, value]
    break
  else:
   self._lst[key_index].append([key, value])

 def get(self, key): # 根据指定的 key 弹出值
  key_index = hash(key) % self._num
  for k, v in self._lst[key_index]:
   if k == key:
    return v
  else:
   raise KeyError('No such {} key'.format(key))

 def pop(self, key): # 根据 key 弹出元素 并且删除
  key_index = hash(key) % self._num
  for i, (k, v) in enumerate(self._lst[key_index]):
   if k == key:
    result = v
    self._lst.pop(i)
    return result
  else:
   raise KeyError('No such {} key'.format(key))

 def __getitem__(self, key): # 可以通过下标来取值
  key_index = hash(key) % self._num
  for k, v in self._lst[key_index]:
   if k == key:
    return v
  else:
   raise KeyError('No such {} key'.format(key))

 def keys(self): # 取得所有的key
  for index in range(self._num):
   for k, v in self._lst[index]:
    yield k

 def values(self): # 取得所有的 value
  for index in range(self._num):
   for k, v in self._lst[index]:
    yield v

 def items(self): # 取得所有的条目
  for index in range(self._num):
   for item in self._lst[index]:
    yield item

通过key查到的时间,可见下图

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

相关文章

  • 实例讲解python中的序列化知识点

    实例讲解python中的序列化知识点

    本篇文章通过代码实例给大家详细分享了关于python中的序列化知识点内容,有兴趣的朋友们可以学习下。
    2018-10-10
  • Python中NumPy的ufuncs函数实例

    Python中NumPy的ufuncs函数实例

    这篇文章主要介绍了Python中NumPy的ufuncs函数实例,NumPy是一个开源的Python科学计算库,使用NumPy,就可以很自然地使用数组和矩阵,本文主要介绍Python Numpy ufuncs通用函数,需要的朋友可以参考下
    2023-07-07
  • 对Python 检查文件名是否规范的实例详解

    对Python 检查文件名是否规范的实例详解

    今天小编就为大家分享一篇对Python 检查文件名是否规范的实例详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-06-06
  • 使用Python发送Post请求以及解析响应结果

    使用Python发送Post请求以及解析响应结果

    发送post的请求参考例子很简单,实际遇到的情况却是很复杂的,下面这篇文章主要给大家介绍了关于如何使用Python发送Post请求以及解析响应结果的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-06-06
  • Python的pdfplumber库将pdf转为图片的实现

    Python的pdfplumber库将pdf转为图片的实现

    本文主要介绍了Python的pdfplumber库将pdf转为图片的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • django项目登录中使用图片验证码的实现方法

    django项目登录中使用图片验证码的实现方法

    这篇文章主要介绍了django项目登录中使用图片验证码的实现代码,代码简单易懂,非常不错,具有一定的参考借鉴价值 ,需要的朋友可以参考下
    2019-08-08
  • opencv+playwright滑动验证码的实现

    opencv+playwright滑动验证码的实现

    滑动验证码是常见的验证码之一,本文主要介绍了opencv+playwright滑动验证码的实现,具有一定的参考价值,感兴趣的可以了解一下
    2023-11-11
  • 使用pyqt5搭建yolo3目标识别界面的方法

    使用pyqt5搭建yolo3目标识别界面的方法

    这篇文章主要介绍了使用pyqt5搭建yolo3目标识别界面的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • 浅谈python的输入输出,注释,基本数据类型

    浅谈python的输入输出,注释,基本数据类型

    这篇文章主要介绍了python的输入输出,注释,基本数据类型,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • 基于Python实现高配版王者小游戏

    基于Python实现高配版王者小游戏

    咳咳,又是一款新的小游戏,就是大家熟悉的王者~本文将利用python来实现高(di)配版的王者的小游戏,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-03-03

最新评论