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 21 Python
Python实现控制台进度条功能
Jan 04 Python
Python基于tkinter模块实现的改名小工具示例
Jul 27 Python
关于python pyqt5安装失败问题的解决方法
Aug 08 Python
详解python实现识别手写MNIST数字集的程序
Aug 03 Python
Python通用循环的构造方法实例分析
Dec 19 Python
python模块之subprocess模块级方法的使用
Mar 26 Python
Python通用函数实现数组计算的方法
Jun 13 Python
Flask教程之重定向与错误处理实例分析
Aug 01 Python
Python如何实现强制数据类型转换
Nov 22 Python
python实现学生通讯录管理系统
Feb 25 Python
Python中生成随机数据安全性、多功能性、用途和速度方面进行比较
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中的Class的几点个人看法
2006/10/09 PHP
隐藏X-Space个人空间下方版权方法隐藏X-Space个人空间标题隐藏X-Space个人空间管理版权方法
2007/02/22 PHP
ThinkPHP php 框架学习笔记
2009/10/30 PHP
php四种基础算法代码实例
2013/10/29 PHP
实现laravel 插入操作日志到数据库的方法
2019/10/11 PHP
Jquery从头学起第四讲 jquery入门教程
2010/08/01 Javascript
jquery向.ashx文件post中文乱码问题的解决方法
2011/03/28 Javascript
当jQuery1.7遇上focus方法的问题
2014/01/26 Javascript
jquery的父子兄弟节点查找示例代码
2014/03/03 Javascript
seajs加载jquery时提示$ is not a function该怎么解决
2015/10/23 Javascript
javascript之IE版本检测超简单方法
2016/08/20 Javascript
无阻塞加载js,防止因js加载不了影响页面显示的问题
2016/12/18 Javascript
利用vscode编写vue的简单配置详解
2017/06/17 Javascript
Vuex入门到上手教程
2018/06/20 Javascript
JavaScript事件对象event用法分析
2018/07/27 Javascript
JavaScript常见事件对象与操作实例总结
2019/01/05 Javascript
python中base64加密解密方法实例分析
2015/05/16 Python
windows系统下Python环境搭建教程
2017/03/28 Python
Python函数any()和all()的用法及区别介绍
2018/09/14 Python
Python 变量的创建过程详解
2019/09/02 Python
python单向循环链表原理与实现方法示例
2019/12/03 Python
Python SSL证书验证问题解决方案
2020/01/13 Python
Python Socket TCP双端聊天功能实现过程详解
2020/06/15 Python
详解pytorch中squeeze()和unsqueeze()函数介绍
2020/09/03 Python
英国的屈臣氏:Boots博姿
2017/12/23 全球购物
德国足球商店:OUTFITTER
2019/05/06 全球购物
英国计算机商店:Technextday
2019/12/28 全球购物
第一范式(1NF)、第二范式(2NF)和第三范式(3NF)之间的区别是什么?
2016/04/28 面试题
服装公司总经理岗位职责
2013/11/30 职场文书
淘宝网店营销策划书
2014/01/11 职场文书
出国留学介绍信
2014/01/13 职场文书
低碳环保口号
2014/06/12 职场文书
岗位职责范本大全
2015/02/26 职场文书
保研推荐信范文
2015/03/25 职场文书
干货:如何写好工作计划!
2019/05/17 职场文书
Python爬虫基础之简单说一下scrapy的框架结构
2021/06/26 Python