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中实现结构相似的函数调用方法
Mar 10 Python
python脚本内运行linux命令的方法
Jul 02 Python
python动态网页批量爬取
Feb 14 Python
使用Python来编写HTTP服务器的超级指南
Feb 18 Python
Python的Django框架中forms表单类的使用方法详解
Jun 21 Python
Python微信企业号开发之回调模式接收微信端客户端发送消息及被动返回消息示例
Aug 21 Python
Python探索之pLSA实现代码
Oct 25 Python
Django模型修改及数据迁移实现解析
Aug 01 Python
Python操作SQLite数据库过程解析
Sep 02 Python
python发qq消息轰炸虐狗好友思路详解(完整代码)
Feb 15 Python
python对execl 处理操作代码
Jun 22 Python
python 实现表情识别
Nov 21 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 登录记住密码实现思路
2013/05/07 PHP
PHP与Java进行通信的实现方法
2013/10/21 PHP
Laravel框架模板继承操作示例
2018/06/11 PHP
PHP设计模式之数据访问对象模式(DAO)原理与用法实例分析
2019/12/12 PHP
php+iframe 实现上传文件功能示例
2020/03/04 PHP
JavaScript RegExp方法获取地址栏参数(面向对象)
2009/03/10 Javascript
jQuery 前的按键判断代码
2010/03/19 Javascript
2010年最佳jQuery插件整理
2010/12/06 Javascript
jquery给图片添加鼠标经过时的边框效果
2013/11/12 Javascript
JavaScript中获取鼠标位置相关属性总结
2014/10/11 Javascript
js实现从数组里随机获取元素
2015/01/12 Javascript
简介JavaScript中getUTCMonth()方法的使用
2015/06/10 Javascript
jquery实现通用的内容渐显Tab选项卡效果
2015/09/07 Javascript
基于JavaScript获取鼠标位置的各种方法
2015/12/16 Javascript
Bootstrap轮播图的使用和理解4
2016/12/14 Javascript
bootstrap模态框实现拖拽效果
2016/12/14 Javascript
JS实现简单的选择题测评系统代码思路详解(demo)
2017/09/03 Javascript
Vue实现PopupWindow组件详解
2018/04/28 Javascript
p5.js临摹旋转爱心
2019/10/23 Javascript
vue打开其他项目页面并传入数据详解
2020/11/25 Vue.js
jenkins自动构建发布vue项目的方法步骤
2021/01/04 Vue.js
[04:56]经典回顾:前Ehome 与 前LGD
2015/02/26 DOTA
django 2.0更新的10条注意事项总结
2018/01/05 Python
Django调用百度AI接口实现人脸注册登录代码实例
2020/04/23 Python
苏宁红孩子母婴商城:redbaby
2017/02/12 全球购物
美国轮胎网站:Priority Tire
2018/11/28 全球购物
军用级手机壳,专为冒险而建:Zizo Wireless
2019/08/07 全球购物
应届生服装设计自我评价
2013/09/20 职场文书
本科生求职简历的自我评价
2013/10/21 职场文书
共产党员承诺书
2014/03/25 职场文书
少儿节目主持串词
2014/04/02 职场文书
广告学专业毕业生自荐信
2014/05/28 职场文书
2014年超市工作总结
2014/11/19 职场文书
2014年评职称工作总结
2014/11/20 职场文书
教师“一帮一”结对子活动总结
2015/05/07 职场文书
解决Git推送错误non-fast-forward的方法
2022/06/25 Servers