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实现查询IP地址所在地
Mar 29 Python
实例讲解Python中global语句下全局变量的值的修改
Jun 16 Python
PyQt5实现无边框窗口的标题拖动和窗口缩放
Apr 19 Python
python操作excel的包(openpyxl、xlsxwriter)
Jun 11 Python
python定向爬虫校园论坛帖子信息
Jul 23 Python
Python实现动态添加属性和方法操作示例
Jul 25 Python
opencv python统计及绘制直方图的方法
Jan 21 Python
pytorch 可视化feature map的示例代码
Aug 20 Python
django删除表重建的实现方法
Aug 28 Python
tensorflow求导和梯度计算实例
Jan 23 Python
python 利用openpyxl读取Excel表格中指定的行或列教程
Feb 06 Python
浅析Python实现DFA算法
Jun 26 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自毁程序(慎用)
2015/07/09 PHP
PHP MVC框架路由学习笔记
2016/03/02 PHP
php实现的双色球算法示例
2017/06/20 PHP
jQuery使用手册之一
2007/03/24 Javascript
Javascript 调试利器 Firebug使用详解六
2009/07/05 Javascript
Js Jquery创建一个弹出层可加载一个页面
2014/05/08 Javascript
Ionic实现仿通讯录点击滑动及$ionicscrolldelegate使用分析
2016/01/18 Javascript
完美解决jQuery符号$与其他javascript 库、框架冲突的问题
2016/08/09 Javascript
jQuery命名空间与闭包用法示例
2017/01/12 Javascript
nodejs搭建本地服务器并访问文件的方法
2017/03/03 NodeJs
vue省市区三联动下拉选择组件的实现
2017/04/28 Javascript
微信小程序实现多个按钮toggle功能的实例
2017/06/13 Javascript
jQuery实现使用sort方法对json数据排序的方法
2018/04/17 jQuery
mpvue构建小程序的方法(步骤+地址)
2018/05/22 Javascript
原生JS实现简单的无缝自动轮播效果
2018/09/26 Javascript
微信小程序实现发送验证码按钮效果
2018/12/20 Javascript
七行JSON代码把你的网站变成移动应用过程详解
2019/07/09 Javascript
vue+axios实现post文件下载
2019/09/25 Javascript
jQuery列表动态增加和删除的实现方法
2020/11/05 jQuery
vue项目中使用rem,在入口文件添加内容操作
2020/11/11 Javascript
python实现JAVA源代码从ANSI到UTF-8的批量转换方法
2015/08/10 Python
pandas通过loc生成新的列方法
2018/11/28 Python
Python 从一个文件中调用另一个文件的类方法
2019/01/10 Python
Python使用Pandas读写Excel实例解析
2019/11/19 Python
Tensorflow轻松实现XOR运算的方式
2020/02/03 Python
Keras中的两种模型:Sequential和Model用法
2020/06/27 Python
英国最大的体育&时尚零售公司:JD Sports
2017/12/13 全球购物
专科毕业生就业推荐信
2013/11/01 职场文书
商务英语专业毕业生自荐信
2013/11/05 职场文书
致跳远运动员广播稿
2014/02/11 职场文书
机关会计岗位职责
2014/04/08 职场文书
中秋节国旗下演讲稿
2014/09/05 职场文书
欧也妮葛朗台读书笔记
2015/06/30 职场文书
小学四年级班主任工作经验交流材料
2015/11/02 职场文书
Mysql多层子查询示例代码(收藏夹案例)
2022/03/31 MySQL
PostgreSQL 插入INSERT、删除DELETE、更新UPDATE、事务transaction
2022/04/12 PostgreSQL