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中关键字is与==的区别简述
Jul 31 Python
python采用getopt解析命令行输入参数实例
Sep 30 Python
解决Python传递中文参数的问题
Aug 04 Python
python线程、进程和协程详解
Jul 19 Python
Flask实现图片的上传、下载及展示示例代码
Aug 03 Python
python判断所输入的任意一个正整数是否为素数的两种方法
Jun 27 Python
Python使用get_text()方法从大段html中提取文本的实例
Aug 27 Python
在jupyter notebook中调用.ipynb文件方式
Apr 14 Python
深入了解python列表(LIST)
Jun 08 Python
python将字典内容写入json文件的实例代码
Aug 12 Python
Django权限控制的使用
Jan 07 Python
Python中np.random.randint()参数详解及用法实例
Sep 23 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
Yii框架学习笔记之应用组件操作示例
2019/11/13 PHP
PHP7移除的扩展和SAPI
2021/03/09 PHP
JavaScript库 开发规则
2009/01/31 Javascript
javascript 关闭IE6、IE7
2009/06/01 Javascript
js实现表格字段排序
2014/02/19 Javascript
javascript数组操作总结和属性、方法介绍
2014/04/05 Javascript
jQuery 实现评论等级好评差评特效
2016/05/06 Javascript
浅谈JavaScript for循环 闭包
2016/06/22 Javascript
Bootstrap被封装的弹层
2016/07/20 Javascript
javascript iframe跨域详解
2016/10/26 Javascript
详解AngularJS验证、过滤器、指令
2017/01/04 Javascript
vue2.0使用swiper组件实现轮播效果
2017/11/27 Javascript
jquery在启动页面时,自动加载数据的实例
2018/01/22 jQuery
js中事件对象和事件委托的介绍
2019/01/21 Javascript
Preload基础使用方法详解
2020/02/03 Javascript
小程序选项卡以及swiper套用(跨页面)
2020/06/19 Javascript
JavaScript 防抖和节流遇见的奇怪问题及解决
2020/11/20 Javascript
[01:10]为家乡而战!完美世界城市挑战赛全国总决赛花絮
2019/07/25 DOTA
一些Python中的二维数组的操作方法
2015/05/02 Python
深入浅析python定时杀进程
2016/06/06 Python
Python 网页解析HTMLParse的实例详解
2017/08/10 Python
python中requests爬去网页内容出现乱码问题解决方法介绍
2017/10/25 Python
python3如何将docx转换成pdf文件
2018/03/23 Python
Python list运算操作代码实例解析
2020/01/20 Python
python实现邮件循环自动发件功能
2020/09/11 Python
纯CSS3绘制打火机动画火焰效果
2016/07/18 HTML / CSS
基于Html5实现的语音搜索功能
2019/05/13 HTML / CSS
英国香水店:The Perfume Shop
2017/03/27 全球购物
美国婚礼礼品网站:MyWeddingFavors
2018/09/26 全球购物
软件测试工程师笔试题带答案
2015/03/27 面试题
2014学年自我鉴定
2014/02/23 职场文书
幼儿评语大全
2014/04/30 职场文书
张家口市高新区党工委群众路线教育实践活动整改方案
2014/10/25 职场文书
2014年审计人员工作总结
2014/12/19 职场文书
Python 中的Sympy详细使用
2021/08/07 Python
疑《守望先锋2》A测截图泄露 或将推出新模式、新界面
2022/04/03 其他游戏