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学习之用pygal画世界地图实例
Dec 07 Python
Tornado 多进程实现分析详解
Jan 12 Python
对numpy中的transpose和swapaxes函数详解
Aug 02 Python
Pandas DataFrame 取一行数据会得到Series的方法
Nov 10 Python
Python 循环终止语句的三种方法小结
Jun 24 Python
python 监测内存和cpu的使用率实例
Nov 28 Python
python Popen 获取输出,等待运行完成示例
Dec 30 Python
基于Tensorflow高阶读写教程
Feb 10 Python
基于python图像处理API的使用示例
Apr 03 Python
解决c++调用python中文乱码问题
Jul 29 Python
python数字类型和占位符详情
Mar 13 Python
python数字图像处理:图像简单滤波
Jun 28 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
一个好用的分页函数
2006/11/16 PHP
详解PHP显示MySQL数据的三种方法
2008/06/05 PHP
php长字符串定义方法
2012/07/12 PHP
PHP中的Memcache详解
2014/04/05 PHP
php的curl封装类用法实例
2014/11/07 PHP
怎样搭建PHP开发环境
2015/07/28 PHP
DIY jquery plugin - tabs标签切换实现代码
2010/12/11 Javascript
轻松创建nodejs服务器(9):实现非阻塞操作
2014/12/18 NodeJs
深入探讨JavaScript String对象
2015/03/09 Javascript
jQuery实现弹出窗口中切换登录与注册表单
2015/06/05 Javascript
jQuery.deferred对象使用详解
2016/03/18 Javascript
canvas快速绘制圆形、三角形、矩形、多边形方法介绍
2016/12/29 Javascript
jQuery实现文档树效果
2017/02/20 Javascript
搭建简单的nodejs http服务器详解
2017/03/09 NodeJs
使用pm2自动化部署node项目的方法步骤
2019/01/28 Javascript
JS实现在线ps功能详解
2019/07/31 Javascript
JavaScript读取本地文件常用方法流程解析
2020/10/12 Javascript
python网页请求urllib2模块简单封装代码
2014/02/07 Python
Django框架的使用教程路由请求响应的方法
2018/07/03 Python
Python tkinter label 更新方法
2018/10/11 Python
python的concat等多种用法详解
2018/11/28 Python
matplotlib实现热成像图colorbar和极坐标图的方法
2018/12/13 Python
Python实现最常见加密方式详解
2019/07/13 Python
python实现用户名密码校验
2020/03/18 Python
Python dict的常用方法示例代码
2020/06/23 Python
改变 Python 中线程执行顺序的方法
2020/09/24 Python
Python语言编写智力问答小游戏功能
2020/10/13 Python
python 获取谷歌浏览器保存的密码
2021/01/06 Python
CSS实现鼠标滑过鼠标点击代码写法
2016/12/26 HTML / CSS
函授自我鉴定范文
2014/02/06 职场文书
小学语文教学经验交流材料
2014/06/02 职场文书
幼儿园感恩节活动方案2014
2014/10/11 职场文书
2014年英语教研组工作总结
2014/12/06 职场文书
2014年财务个人工作总结
2014/12/08 职场文书
2015年反腐倡廉工作总结
2015/05/14 职场文书
推荐六本经典文学奖书籍:此生必读
2019/08/22 职场文书