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之有容乃大的list(3)
Sep 15 Python
Python中的Classes和Metaclasses详解
Apr 02 Python
Python实现基于权重的随机数2种方法
Apr 28 Python
在Django中同时使用多个配置文件的方法
Jul 22 Python
Python 专题六 局部变量、全局变量global、导入模块变量
Mar 20 Python
python+mysql实现教务管理系统
Feb 20 Python
解决python tkinter界面卡死的问题
Jul 17 Python
python做接口测试的必要性
Nov 20 Python
python数据化运营的重要意义
Nov 25 Python
django3.02模板中的超链接配置实例代码
Feb 04 Python
keras的三种模型实现与区别说明
Jul 03 Python
Pytorch模型迁移和迁移学习,导入部分模型参数的操作
Mar 03 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 创建标签云函数代码
2010/05/26 PHP
php简单浏览目录内容的实现代码
2013/06/07 PHP
关于PHP session 存储方式的详细介绍
2013/06/25 PHP
PHP模糊查询的实现方法(推荐)
2016/09/06 PHP
jquery在IE、FF浏览器的差别详细探讨
2013/04/28 Javascript
点击弹出层效果&弹出窗口后网页背景变暗效果的实现代码
2014/02/10 Javascript
基于javascript实现彩票随机数生成(简单版)
2020/04/17 Javascript
在JavaScript中call()与apply()区别
2016/01/22 Javascript
详解Webwork中Action 调用的方法
2016/02/02 Javascript
简单讲解AngularJS的Routing路由的定义与使用
2016/03/05 Javascript
JS基于递归实现网页版计算器的方法分析
2017/12/20 Javascript
Vue仿支付宝支付功能
2018/05/25 Javascript
JavaScript工具库之Lodash详解
2019/06/15 Javascript
Openlayers测量距离与面积的实现方法
2020/09/25 Javascript
[00:31]DOTA2上海特级锦标赛 Fnatic战队宣传片
2016/03/04 DOTA
Python三元运算实现方法
2015/01/12 Python
Python:Scrapy框架中Item Pipeline组件使用详解
2017/12/27 Python
解决python打不开文件(文件不存在)的问题
2019/02/18 Python
利用python实现冒泡排序算法实例代码
2019/12/01 Python
python 画图 图例自由定义方式
2020/04/17 Python
Python自动创建Excel并获取内容
2020/09/16 Python
HTML5打开手机扫码功能及优缺点
2017/11/27 HTML / CSS
介绍一下木马病毒的种类
2015/07/26 面试题
营业经理岗位职责
2013/11/10 职场文书
自荐书范文
2013/12/08 职场文书
学习标兵获奖感言
2014/02/20 职场文书
感恩教育活动总结
2014/05/05 职场文书
给校长的建议书400字
2014/05/15 职场文书
计划生育证明格式范本
2014/09/12 职场文书
2015年度党员自我评价范文
2015/03/03 职场文书
2015年公司国庆放假通知
2015/07/30 职场文书
党员反四风学习心得体会
2016/01/22 职场文书
2019新员工试用期转正工作总结范文
2019/08/21 职场文书
Python自动化测试PO模型封装过程详解
2021/06/22 Python
Python爬取用户观影数据并分析用户与电影之间的隐藏信息!
2021/06/29 Python
浅谈Node的内存泄露问题
2022/05/06 NodeJs