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判断操作系统类型代码分享
Nov 22 Python
python多线程用法实例详解
Jan 15 Python
python中关于for循环的碎碎念
Jun 30 Python
Python使用Matplotlib实现雨点图动画效果的方法
Dec 23 Python
python 实现将字典dict、列表list中的中文正常显示方法
Jul 06 Python
用于业余项目的8个优秀Python库
Sep 21 Python
对Python3之进程池与回调函数的实例详解
Jan 22 Python
Python玩转加密的技巧【推荐】
May 13 Python
Python利用神经网络解决非线性回归问题实例详解
Jul 19 Python
浅谈Python 递归算法指归
Aug 22 Python
python计算n的阶乘的方法代码
Oct 25 Python
Django日志及中间件模块应用案例
Sep 10 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
显示youtube视频缩略图和Vimeo视频缩略图代码分享
2014/02/13 PHP
PHP请求Socket接口测试实例
2016/08/12 PHP
php 生成签名及验证签名详解
2016/10/26 PHP
PHP实现分布式memcache设置web集群session同步的方法
2018/04/10 PHP
jquery validate.js表单验证的基本用法入门
2010/05/13 Javascript
js实现飞入星星特效代码
2014/10/17 Javascript
jquery事件的ready()方法使用详解
2015/11/11 Javascript
使用jQuery在移动页面上添加按钮和给按钮添加图标
2015/12/04 Javascript
AngularJS中的$watch(),$digest()和$apply()区分
2016/04/04 Javascript
VueJS 集成 Medium Editor的示例代码 (自定义编辑器按钮)
2017/08/24 Javascript
jquery实现回车键触发事件(实例讲解)
2017/11/21 jQuery
最适应的vue.js的form提交涉及多种插件【推荐】
2018/08/27 Javascript
快速解决vue在ios端下点击响应延时的问题
2018/08/27 Javascript
使用Vue 实现滑动验证码功能
2019/06/27 Javascript
layui对工具条进行选择性的显示方法
2019/09/19 Javascript
对vuex中getters计算过滤操作详解
2019/11/06 Javascript
使用Python生成url短链接的方法
2015/05/04 Python
python的pdb调试命令的命令整理及实例
2017/07/12 Python
Python 比较两个数组的元素的异同方法
2017/08/17 Python
Python DataFrame 设置输出不显示index(索引)值的方法
2018/06/07 Python
python实现批量nii文件转换为png图像
2019/07/18 Python
django项目用higcharts统计最近七天文章点击量
2019/08/17 Python
python批量处理文件或文件夹
2020/07/28 Python
Python流程控制常用工具详解
2020/02/24 Python
完美解决keras保存好的model不能成功加载问题
2020/06/11 Python
Keras 中Leaky ReLU等高级激活函数的用法
2020/07/05 Python
HTML最新标准HTML5总结(必看)
2016/06/13 HTML / CSS
中国电视购物:快乐购
2017/02/04 全球购物
机械设计制造专业个人求职信
2013/09/25 职场文书
应届毕业生就业自荐信
2013/10/26 职场文书
《夸父追日》教学反思
2014/02/26 职场文书
综合素质评价自我评价
2015/03/06 职场文书
可可西里观后感
2015/06/08 职场文书
2015国庆66周年宣传语
2015/07/14 职场文书
Java Spring 控制反转(IOC)容器详解
2021/10/05 Java/Android
vue项目支付功能代码详解
2022/02/18 Vue.js