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


Posted in Python onMarch 25, 2017

前言

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

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

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

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

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

拉链法:就是在一个列表中每个位置再添加一个列表,这样就算是有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采用raw_input读取输入值的方法
Aug 18 Python
详细解析Python当中的数据类型和变量
Apr 25 Python
Python中map和列表推导效率比较实例分析
Jun 17 Python
搭建Python的Django框架环境并建立和运行第一个App的教程
Jul 02 Python
pygame实现弹力球及其变速效果
Jul 03 Python
Python使用Selenium模块实现模拟浏览器抓取淘宝商品美食信息功能示例
Jul 18 Python
Python实现的对本地host127.0.0.1主机进行扫描端口功能示例
Feb 15 Python
Python Django框架单元测试之文件上传测试示例
May 17 Python
python实现DEM数据的阴影生成的方法
Jul 23 Python
一文了解python 3 字符串格式化 F-string 用法
Mar 04 Python
打印tensorflow恢复模型中所有变量与操作节点方式
May 26 Python
Flask response响应的具体使用
Jul 15 Python
python3实现ftp服务功能(服务端 For Linux)
Mar 24 #Python
python3实现ftp服务功能(客户端)
Mar 24 #Python
Python 中urls.py:URL dispatcher(路由配置文件)详解
Mar 24 #Python
python 类详解及简单实例
Mar 24 #Python
Python类的动态修改的实例方法
Mar 24 #Python
Python操作Excel之xlsx文件
Mar 24 #Python
解决uWSGI的编码问题详解
Mar 24 #Python
You might like
PHP6 先修班 JSON实例代码
2008/08/23 PHP
深入理解PHP原理之错误抑制与内嵌HTML分析
2011/05/02 PHP
PHP 的异常处理、错误的抛出及回调函数等面向对象的错误处理方法
2012/12/07 PHP
php入门教程之Zend Studio设置与开发实例
2016/09/09 PHP
addEventListener()第三个参数useCapture (Boolean)详细解析
2013/11/07 Javascript
用js读、写、删除Cookie代码分享及详细注释说明
2014/06/05 Javascript
JS实现仿QQ面板的手风琴效果折叠菜单代码
2015/09/11 Javascript
JS+CSS实现仿支付宝菜单选中效果代码
2015/09/25 Javascript
jQuery轮播图效果精简版完整示例
2016/09/04 Javascript
jQuery ready()和onload的加载耗时分析
2016/09/08 Javascript
ThinkPHP+jquery实现“加载更多”功能代码
2017/03/11 Javascript
js canvas实现QQ拨打电话特效
2017/05/10 Javascript
详解 vue.js用法和特性
2017/10/15 Javascript
React之PureComponent的使用作用
2018/07/10 Javascript
angular学习之动态创建表单的方法
2018/12/07 Javascript
如何能分清npm cnpm npx nvm
2019/01/17 Javascript
JavaScript获取页面元素的常用方法详解
2019/09/28 Javascript
js实现鼠标滑动到某个div禁止滚动
2020/09/17 Javascript
vue+vant 上传图片需要注意的地方
2021/01/03 Vue.js
[03:11]完美世界DOTA2联赛PWL DAY8集锦
2020/11/09 DOTA
Python 返回汉字的汉语拼音
2009/02/27 Python
给Python初学者的一些编程技巧
2015/04/03 Python
Python学习思维导图(必看篇)
2017/06/26 Python
利用numpy和pandas处理csv文件中的时间方法
2018/04/19 Python
Sanic框架基于类的视图用法示例
2018/07/18 Python
djano一对一、多对多、分页实例代码
2019/08/16 Python
Python Numpy中数据的常用保存与读取方法
2020/04/01 Python
鲜为人知的HTML5语音合成功能
2019/05/17 HTML / CSS
Burberry英国官网:英国标志性奢侈品牌
2017/03/29 全球购物
绩效工资分配方案
2014/01/18 职场文书
金融管理应届生求职信
2014/02/20 职场文书
英语教育专业自荐信
2014/05/29 职场文书
小学三好学生事迹材料
2014/08/15 职场文书
中秋节晚会开场白
2015/05/29 职场文书
2016高校自主招生自荐信范文
2016/01/28 职场文书
七年级作文之我的梦想
2019/10/16 职场文书