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中使用bidict模块双向字典结构的奇技淫巧
Jul 12 Python
Python中字典和集合学习小结
Jul 07 Python
使用python爬虫实现网络股票信息爬取的demo
Jan 05 Python
python中将字典形式的数据循环插入Excel
Jan 16 Python
Python数据分析之双色球统计单个红和蓝球哪个比例高的方法
Feb 03 Python
python微信跳一跳系列之棋子定位颜色识别
Feb 26 Python
将python图片转为二进制文本的实例
Jan 24 Python
Python从文件中读取数据的方法讲解
Feb 14 Python
Python时间序列处理之ARIMA模型的使用讲解
Apr 02 Python
python集合常见运算案例解析
Oct 17 Python
OpenCV python sklearn随机超参数搜索的实现
Jan 17 Python
python 工具 字符串转numpy浮点数组的实现
Mar 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
超级简单的发送邮件程序
2006/10/09 PHP
DISCUZ 论坛管理员密码忘记的解决方法
2009/05/14 PHP
防止本地用户用fsockopen DDOS攻击对策
2011/11/02 PHP
PHP关于IE下的iframe跨域导致session丢失问题解决方法
2013/10/10 PHP
YII动态模型(动态表名)支持分析
2016/03/29 PHP
js两行代码按指定格式输出日期时间
2011/10/21 Javascript
javascript设置连续两次点击按钮时间间隔的方法
2014/10/28 Javascript
jQuery+CSS实现一个侧滑导航菜单代码
2016/05/09 Javascript
BootStrap tooltip提示框使用小结
2016/10/26 Javascript
bootstrap——bootstrapTable实现隐藏列的示例
2017/01/14 Javascript
借助node实战JSONP跨域实例
2017/03/30 Javascript
jQuery+vue.js实现的九宫格拼图游戏完整实例【附源码下载】
2017/09/12 jQuery
vue data恢复初始化数据的实现方法
2019/10/31 Javascript
微信小程序实用代码段(收藏版)
2019/12/17 Javascript
微信小程序实现同时上传多张图片
2020/02/03 Javascript
JavaScript组合模式---引入案例分析
2020/05/23 Javascript
了不起的11个JavaScript代码重构最佳实践小结
2021/01/11 Javascript
[01:24]DOTA2上海特锦赛OG战队抵达 专车接机入驻总统套房
2016/02/23 DOTA
[00:19]CN DOTA NEVER DIE!VG夺冠rOtK接受采访
2019/12/23 DOTA
如何准确判断请求是搜索引擎爬虫(蜘蛛)发出的请求
2015/10/13 Python
Python使用爬虫爬取静态网页图片的方法详解
2018/06/05 Python
Python实现将Excel转换成xml的方法示例
2018/08/25 Python
值得收藏的10道python 面试题
2019/04/15 Python
解决Pyinstaller 打包exe文件 取消dos窗口(黑框框)的问题
2019/06/21 Python
在python 中split()使用多符号分割的例子
2019/07/15 Python
使用Pycharm分段执行代码
2020/04/15 Python
LTD Commodities:礼品,独特发现,家居装饰,家用器皿
2017/08/11 全球购物
李维斯牛仔裤荷兰官方网站:Levi’s NL
2020/08/23 全球购物
夜大自我鉴定
2013/10/31 职场文书
物流司机岗位职责
2013/12/28 职场文书
幼儿园六一亲子活动方案
2014/08/26 职场文书
售房协议书范本2014
2014/10/23 职场文书
财务检查整改报告
2014/11/06 职场文书
学生会招新宣传语
2015/07/13 职场文书
Unity连接MySQL并读取表格数据的实现代码
2021/06/20 MySQL
Python装饰器的练习题
2021/11/23 Python