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使用Tkinter显示网络图片的方法
Apr 24 Python
浅谈numpy中linspace的用法 (等差数列创建函数)
Jun 07 Python
Matplotlib 生成不同大小的subplots实例
May 25 Python
Python常见数字运算操作实例小结
Mar 22 Python
python lxml中etree的简单应用
May 10 Python
django基于cors解决跨域请求问题详解
Aug 06 Python
Python 实现opencv所使用的图片格式与 base64 转换
Jan 09 Python
如何基于pythonnet调用halcon脚本
Jan 20 Python
python批量替换文件名中的共同字符实例
Mar 05 Python
Django 解决新建表删除后无法重新创建等问题
May 21 Python
Python爬虫获取页面所有URL链接过程详解
Jun 04 Python
教你如何使用Python下载B站视频的详细教程
Apr 29 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&mysql(二)
2006/10/09 PHP
PHP中替换换行符的几种方法小结
2012/10/15 PHP
php简单实现多字节字符串翻转的方法
2015/03/31 PHP
PHP使用CURL模拟登录的方法
2015/07/08 PHP
php正则表达式基本知识与应用详解【经典教程】
2017/04/17 PHP
php利用fsockopen GET/POST提交表单及上传文件
2017/05/22 PHP
网页前端优化之滚动延时加载图片示例
2013/07/13 Javascript
Jquery ajax执行顺序 返回自定义错误信息(实例讲解)
2013/11/06 Javascript
JavaScript中的replace()方法使用详解
2015/06/06 Javascript
元素绑定click点击事件方法
2015/06/08 Javascript
jQuery简单实现中间浮窗效果
2016/09/04 Javascript
vue项目打包后打开页面空白解决办法
2018/06/29 Javascript
详解离线安装npm包的几种方法
2018/11/25 Javascript
对于防止按钮重复点击的尝试详解
2019/04/22 Javascript
详解webpack引用jquery(第三方模块)的三种办法
2019/08/21 jQuery
JS校验与最终登陆界面功能完整示例
2020/01/13 Javascript
Vue.js的模板语法详解
2020/02/16 Javascript
在pycharm中开发vue的方法步骤
2020/03/04 Javascript
javascript设计模式 ? 观察者模式原理与用法实例分析
2020/04/22 Javascript
[03:21]【TI9纪实】Old Boys
2019/08/23 DOTA
详解利用Python scipy.signal.filtfilt() 实现信号滤波
2019/06/05 Python
Pytorch根据layers的name冻结训练方式
2020/01/06 Python
解决Jupyter notebook更换主题工具栏被隐藏及添加目录生成插件问题
2020/04/20 Python
Pycharm Git 设置方法
2020/09/15 Python
Expedia泰国:预订机票、酒店和旅游包(航班+酒店)
2016/09/27 全球购物
Mytheresa美国官网:德国知名的女性奢侈品电商
2017/05/27 全球购物
CLR与IL分别是什么含义
2016/08/23 面试题
运动会解说词200字
2014/02/06 职场文书
学雷锋树新风演讲稿
2014/05/10 职场文书
商标侵权律师函
2015/05/27 职场文书
《春酒》教学反思
2016/02/22 职场文书
宪法宣传标语100条
2019/10/15 职场文书
python文本处理的方案(结巴分词并去除符号)
2021/05/26 Python
MySQL系列之八 MySQL服务器变量
2021/07/02 MySQL
MYSQL如何查看操作日志详解
2022/05/30 MySQL
PostgreSQL怎么创建分区表详解
2022/06/25 PostgreSQL