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 时间处理datetime实例
Sep 06 Python
Python学习笔记之os模块使用总结
Nov 03 Python
在Python下使用Txt2Html实现网页过滤代理的教程
Apr 11 Python
python使用urllib2提交http post请求的方法
May 26 Python
深入理解python中的闭包和装饰器
Jun 12 Python
Python:Scrapy框架中Item Pipeline组件使用详解
Dec 27 Python
Python实现PS滤镜碎片特效功能示例
Jan 24 Python
Python实现全排列的打印
Aug 18 Python
对python中词典的values值的修改或新增KEY详解
Jan 20 Python
python 通过类中一个方法获取另一个方法变量的实例
Jan 22 Python
Python+Tkinter打造签名设计工具
Apr 01 Python
在NumPy中深拷贝和浅拷贝相关操作的定义和背后的原理
Apr 14 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 session_start()关于Cannot send session cache limiter - headers already sent错误解决方法
2009/11/27 PHP
php echo 输出字符串函数详解
2010/05/13 PHP
使用openssl实现rsa非对称加密算法示例
2014/01/24 PHP
Thinkphp将二维数组变为标签适用的一维数组方法总结
2014/10/30 PHP
php生成二维码时出现中文乱码的解决方法
2014/12/18 PHP
php通过rmdir删除目录的简单用法
2015/03/18 PHP
Yii2 rbac权限控制之rule教程详解
2016/06/23 PHP
php排序算法实例分析
2016/10/17 PHP
JavaScript写的一个DIV 弹出网页对话框
2009/08/14 Javascript
js读取配置文件自写
2014/02/11 Javascript
浅谈Javascript中匀速运动的停止条件
2014/12/19 Javascript
JavaScript实现Java中StringBuffer的方法
2015/02/09 Javascript
浅谈Jquery核心函数
2015/06/18 Javascript
js仿苹果iwatch外观的计时器代码分享
2015/08/26 Javascript
javascript中call apply 与 bind方法详解
2016/03/10 Javascript
分享jQuery网页元素拖拽插件
2020/12/01 Javascript
Bootstrap Metronic完全响应式管理模板之菜单栏学习笔记
2016/07/08 Javascript
Bootstrap插件全集
2016/07/18 Javascript
微信小程序 火车票查询实例讲解
2016/10/17 Javascript
vue2.0设置proxyTable使用axios进行跨域请求的方法
2017/10/19 Javascript
jquery 通过ajax请求获取后台数据显示在表格上的方法
2018/08/08 jQuery
详解ES6中的 Set Map 数据结构学习总结
2018/11/06 Javascript
jQuery选择器选中最后一个元素,倒数第二个元素操作示例
2018/12/10 jQuery
JS实现纵向轮播图(初级版)
2020/01/18 Javascript
js如何验证密码强度
2020/03/18 Javascript
Python常见排序操作示例【字典、列表、指定元素等】
2018/08/15 Python
德国网上宠物店:Zoobio
2018/05/23 全球购物
美国眼镜在线零售商:Dualens
2019/12/07 全球购物
俄罗斯三星品牌商店:Samsungstore
2020/04/05 全球购物
Web Service面试题:如何搭建Axis2的开发环境
2012/06/20 面试题
农村婚庆司仪主持词
2014/03/15 职场文书
荆州古城导游词
2015/02/06 职场文书
干部考核工作总结2015
2015/07/24 职场文书
孩子满月酒答谢词
2015/09/30 职场文书
CSS精灵图的原理与使用方法介绍
2022/03/17 HTML / CSS
MySQL详解进行JDBC编程与增删改查方法
2022/06/16 MySQL