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实现扫描局域网活动ip(扫描在线电脑)
Apr 28 Python
Python2.7简单连接与操作MySQL的方法
Apr 27 Python
Python实现文件内容批量追加的方法示例
Aug 29 Python
python列表的增删改查实例代码
Jan 30 Python
在IPython中执行Python程序文件的示例
Nov 01 Python
对pandas中iloc,loc取数据差别及按条件取值的方法详解
Nov 06 Python
python对视频画框标记后保存的方法
Dec 07 Python
Django使用unittest模块进行单元测试过程解析
Aug 02 Python
pandas数据处理进阶详解
Oct 11 Python
tensorflow2.0与tensorflow1.0的性能区别介绍
Feb 07 Python
python实现一个猜拳游戏
Apr 05 Python
详解NumPy中的线性关系与数据修剪压缩
May 25 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
PHP文件下载类
2006/12/06 PHP
php中用date函数获取当前时间有误的解决办法
2013/08/02 PHP
基于php实现的php代码加密解密类完整实例
2016/10/12 PHP
PHP/HTML混写的四种方式总结
2017/02/27 PHP
Yii框架创建cronjob定时任务的方法分析
2017/05/23 PHP
深入理解JavaScript系列(3) 全面解析Module模式
2012/01/15 Javascript
js弹出框轻量级插件jquery.boxy使用介绍
2013/01/15 Javascript
Javascript遍历table中的元素示例代码
2014/07/08 Javascript
jQuery检测鼠标左键和右键点击的方法
2015/03/17 Javascript
深入理解js函数的作用域与this指向
2016/05/28 Javascript
Three.js学习之正交投影照相机
2016/08/01 Javascript
Bootstrap源码学习笔记之bootstrap进度条
2016/12/24 Javascript
微信小程序  checkbox组件详解及简单实例
2017/01/10 Javascript
vue.js数据绑定的方法(单向、双向和一次性绑定)
2017/07/13 Javascript
ES6正则表达式扩展笔记
2017/07/25 Javascript
express框架实现基于Websocket建立的简易聊天室
2017/08/10 Javascript
判断div滑动到底部的scroll实例代码
2017/11/15 Javascript
JS实现的3des+base64加密解密算法完整示例
2018/05/18 Javascript
Vue组件之高德地图地址选择功能的实例代码
2019/06/21 Javascript
Python实现批量更换指定目录下文件扩展名的方法
2016/09/19 Python
opencv改变imshow窗口大小,窗口位置的方法
2018/04/02 Python
python日期时间转为字符串或者格式化输出的实例
2018/05/29 Python
Python3.0 实现决策树算法的流程
2019/08/08 Python
pytorch实现mnist数据集的图像可视化及保存
2020/01/14 Python
PyCharm中如何直接使用Anaconda已安装的库
2020/05/28 Python
Python和Bash结合在一起的方法
2020/11/13 Python
C#笔试题集合
2013/06/21 面试题
高级Java程序员面试题
2016/06/23 面试题
大学生活动总结模板
2014/07/02 职场文书
预备党员群众路线思想汇报2014
2014/10/25 职场文书
2014公司年终工作总结
2014/12/19 职场文书
党员个人年度总结
2015/02/14 职场文书
装饰施工员岗位职责
2015/04/11 职场文书
公司员工管理制度
2015/08/04 职场文书
2016年国培心得体会及反思
2016/01/13 职场文书
Vue OpenLayer测距功能的实现
2022/04/20 Vue.js