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中自定义函数的教程
Apr 27 Python
python3 实现的人人影视网站自动签到
Jun 19 Python
python实现redis三种cas事务操作
Dec 19 Python
Python实现的拉格朗日插值法示例
Jan 08 Python
Python实现简单石头剪刀布游戏
Jan 20 Python
Python 安装第三方库 pip install 安装慢安装不上的解决办法
Jun 18 Python
Python爬虫学习之翻译小程序
Jul 30 Python
python自动发微信监控报警
Sep 06 Python
Flask框架搭建虚拟环境的步骤分析
Dec 21 Python
春节到了 教你使用python来抢票回家
Jan 06 Python
Python logging日志模块 配置文件方式
Jul 12 Python
全网最细 Python 格式化输出用法讲解(推荐)
Jan 18 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会员权限控制实现原理分析
2011/05/29 PHP
php面向对象中static静态属性和静态方法的调用
2015/02/08 PHP
php结合curl实现多线程抓取
2015/07/09 PHP
jQuery 动画基础教程
2008/12/25 Javascript
json 实例详细说明教程
2009/10/31 Javascript
JavaScript操作XML实例代码(获取新闻标题并分页,并分页)
2010/05/25 Javascript
javascript 数组排序函数sort和reverse使用介绍
2013/11/21 Javascript
jQuery设置Cookie及删除Cookie实例分析
2016/04/15 Javascript
Angular 常用指令实例总结整理
2016/12/13 Javascript
jQuery EasyUI Accordion可伸缩面板组件使用详解
2017/02/28 Javascript
谈谈JS中的!!
2017/12/07 Javascript
Vue项目服务器部署之子目录部署方法
2019/05/12 Javascript
js实现课堂随机点名系统
2019/11/21 Javascript
[03:52]DOTA2英雄基础教程 酒仙
2013/12/23 DOTA
布同 Python中文问题解决方法(总结了多位前人经验,初学者必看)
2011/03/13 Python
Python使用新浪微博API发送微博的例子
2014/04/10 Python
PyQt5通信机制 信号与槽详解
2019/08/07 Python
python 利用turtle库绘制笑脸和哭脸的例子
2019/11/23 Python
Python定义一个Actor任务
2020/07/29 Python
世界首屈一指的在线男士内衣权威:HisRoom
2017/08/05 全球购物
设计毕业生简历中的自我评价
2013/10/01 职场文书
结婚周年感言
2014/02/24 职场文书
大学军训感言600字
2014/02/25 职场文书
小学教师读书活动总结
2014/07/08 职场文书
学校节能宣传周活动总结
2014/07/09 职场文书
邹越感恩父母演讲稿
2014/08/28 职场文书
信仰心得体会
2014/09/05 职场文书
标准离婚协议书(2014版)
2014/10/05 职场文书
2014年服装销售工作总结
2014/11/27 职场文书
优秀员工推荐材料
2014/12/20 职场文书
迟到检讨书范文
2015/01/27 职场文书
《索溪峪的野》教学反思
2016/02/19 职场文书
写作指导:怎么书写竞聘演讲稿?
2019/07/04 职场文书
OpenCV绘制圆端矩形的示例代码
2021/08/30 Python
Element-ui Layout布局(Row和Col组件)的实现
2021/12/06 Vue.js
nginx rewrite功能使用场景分析
2022/05/30 Servers