Python里的实现用了一种被称为散列表(hash table,也被称为哈希表)的更高效的数据结构。

散列表的核心是散列函数(hashing function,也被称为哈希函数)。散列函数会把键作为参数,然后对它执行一些简单的计算从而生成一个数字。由于计算机上的所有数据最终都按比特(二进制数)存储,因此可以很容易地找到一个合适的散列函数。Python也有一个内置的函数hash来实现这个散列函数。你可以通过下面这样的交互操作来进行尝试:

>>> hash(2)
2
>>> hash(3.4)
922337203685477379
>>> hash(3.4)
922337203685477379
>>> hash('c')
2429946187753368536
>>> hash(None)
8795546022280
>>> hash((1,'spam'))
-5029320327249233509
>>> hash([1,2,3])
Traceback (most recent call last):File "<pyshell#6>", line 1, in <module>hash([1,2,3])
TypeError: unhashable type: 'list'
>>>

提供任何“能够被散列”的东西给hash函数都会产生一个int结果。注意看最后两次交互操作。元组是可以被散列的,但列表则不行。散列函数的一个要求是,无论何时,调用它去处理特定的对象,它都必须始终计算出完全相同的结果。由于散列函数依赖于对象的底层存储方式来生成散列值,因此在对象的底层存储方式不会发生变化的时候,能够保证这个值是有效的。换句话说,我们只能散列贫血对象(不可变的对象)。像数字、字符串和元组都是不可变的,因此它们可以被散列。然而,因为列表是可以被修改的,所以Python不允许对它们进行散列操作。

只要有一个合适的散列函数,就可以简单地创建一个散列表来实现字典了。散列表实际上只是一个用来存储(key, value)键值对的大型列表。然而,这些“对”并不是一个接一个地被顺序存储的,而是会被存储在列表中的散列键所确定的索引处。比如,假设我们分配了一个大小为1000的列表(这就是我们的“表”)。为了存储键值对(“c”,“Clubs”),我们会先计算hash(“c”) % 1000=226。因此,这个元素将会被存储在位置226。在这里,余数操作可以保证我们得到的结果在range(1000)范围内,这个值会是我们表里的一个有效索引。当有一个恰当的散列函数时,元素将会以相对平均的方式分布在整个表格之中

只要字典中没有两个键被散列到完全相同的位置,这个实现就会非常高效。插入一个新元素需要花费常量时间,因为我们只需要应用散列函数,然后把这个元素分配到列表中对应的位置。查找会有类似的复杂性,我们还是先计算散列值,然后我们就能够知道应该去哪里找到元素了。要删除一个元素,我们只需将一个特殊的标记(例如None)放到相应的位置。因此,所有基本的字典操作都可以在常量Θ(1)时间内完成

那么,当两个键被散列到同一个位置时会发生什么呢?这种现象被称为碰撞(collision)。现在,你只需要知道已经有很好的技术来处理这个问题就行了。在使用了这些技术并确保有足够大小的表格之后,就可以建立一个允许常量时间操作的数据结构了。所以,Python的词典非常高效,只要你有足够多的可用内存,你就可以轻松地处理成千上万甚至是几百万条条目了。并且,Python解释器本身就在很大程度上依赖于使用字典来维护命名空间,所以字典的实现已经经过了高度的优化

总结

  • python字典通过散列表这种数据结构实现
  • 列表不能求哈希值

Python 字典实现原理相关推荐

  1. python字典实现原理-哈希函数-解决哈希冲突方法

    python字典实现原理-哈希函数-解决哈希冲突方法 参考文章: (1)python字典实现原理-哈希函数-解决哈希冲突方法 (2)https://www.cnblogs.com/guyannanfe ...

  2. python字典实现原理_python学习笔记_第7天(字典底层原理+选择结构)

    字典:(拓展–重要)字典核心底层原理 字典对象的核心是散列表,散列表是一个稀疏数组(总是有空白元素的数组),数组的每个单元叫做bucket. 每个bucket 有两部分:一个是键对象的引用,一个是值对 ...

  3. python字典实现原理_Python字典底层实现原理详解

    在Python中,字典是通过散列表或说哈希表实现的.字典也被称为关联数组,还称为哈希数组等.也就是说,字典也是一个数组,但数组的索引是键经过哈希函数处理后得到的散列值.哈希函数的目的是使键均匀地分布在 ...

  4. 带你自学Python系列(九):一文读懂Python中字典应用原理!

    ↑ 点击上方[计算机视觉联盟]关注我们 今天是小编持续更新关于Python的知识总结以及Python实践项目应用的第9天,带你利用零碎时间自学最受欢迎的编程语言之一Python语言.你和小编一起打卡了 ...

  5. python字典长度可变吗_Python字典dict实现原理

    一. 什么是字典? 字典是一系列由键(key)和值(value)配对组成的元素的集合.字典是一个可变容器模型,可以存储任意类型对象.字典实现与哈希算法密不可分(不同的Python版本,算法会不同),不 ...

  6. Python字典底层实现原理

    字典是否是有序 在Python3.6之前,字典是无序的,但是Python3.7+,字典是有序的. 在3.6中,字典有序是一个implementation detail,在3.7才正式成为语言特性,因此 ...

  7. 倒排索引统计与 Python 字典

    2019独角兽企业重金招聘Python工程师标准>>> 最近折腾索引引擎以及数据统计方面的工作比较多, 与 Python 字典频繁打交道, 至此整理一份此方面 API 的用法与坑法备 ...

  8. 这样合并Python字典,可以让程序的运行效率提高4倍

    摘要:在Python中,合并字典有多种方式,通过内建函数.运算符.自定义函数等,都可以完成合并字典的功能,但这些方式,哪些效率低,哪些效率高呢?本文将对这些合并字典的方式进行逐个深度详解,最后会比较这 ...

  9. python字典添加数组_一步一步学Python3(小学生也适用) 第十三篇: 字典Dict类型

    前面我们已经学习了Python的字符串,列表,元组,这一篇我们将学习字典,字典的使用频率是非常高,跟前面几篇一样,只要你用Python编程,就避不开Python字典. 一.创建字典 字典由键(key) ...

最新文章

  1. Python之文件操作
  2. workerman连接mysql_workerman Mysql使用
  3. 高大上的Android沉浸式状态栏?
  4. 小程序中Cannot read property ‘setData‘ of undefined问题的解决
  5. [实验]-从汇编代码来看volatile关键字的作用
  6. rabbitmq异步_在Node.js中使用RabbitMQ和Tortoise进行异步消息传递
  7. ibm量子计算机应用,科学网—IBM量子计算机获重大突破 可进行百万项计算
  8. 超逼真AI设计师,谷歌大脑推出新的文本生成图像模型Imagen
  9. 【Python训练营】Python每日一练----第28天:鲁卡斯队列(round函数用法)
  10. SystemUI之通知图标控制
  11. DataSec数据防泄密系统
  12. 岁月温柔-6 出院后忐忑不安的妈妈
  13. 【服务计算】第十六周实验报告
  14. 浙江大学PAT-1003. 我要通过!(20)
  15. 无线传感网络技术与应用项目化教程(一)
  16. 提取IEMOCAP情感语料库标签
  17. php 正则车架号,iOS 车架号、船舶号等正则【原创】
  18. 【网络教程】如何运用rar压缩软件打包程序,实现安装引导等功能!
  19. 运维到底是干什么的?看完这篇你就懂了
  20. 【EAGLE】学习记录1——制板速成

热门文章

  1. 安装Tensorflow-gpu版本
  2. “后序遍历二叉运算树进行Lambda演算的化简”带来的联系
  3. 研究生开学需要准备的事宜(准研究生和保研必看)
  4. 广西移动计算机面试题,广西移动笔试经验分享
  5. 开机时设置linux 内核参数 mem,Linux内核开机保留大块内存的方法总结
  6. linux cpu监控方案,Linux性能优化和监控系列(二)分析CPU性能
  7. android byte转string_“嵌入式开发学脚本干嘛”之进制/Byte/Hex处理
  8. 分享一个selenium jar包 的下载地址,各版本都有,包括selenium-server-standalone.jar、selenium、selenium-server
  9. matlab breline,linebreak_header must be terminated by a line break怎么解决
  10. java struts2 作用_struts2是什么?如何使用?