“选择正确的数据结构并坚持使用它!虽然对于某个特定操作来说也许还存在更高效的数据结构,但是在这些数据结构之间进行转换的代价可能会抵消效率上的增益。”  摘自《Python高性能编程》
 Python中的列表本质是动态的数组,它与数组的区别在于:1)数组定义好之后就无法扩容了,而列表在定义好之后可以扩容;2)数组只能同时存储一种类型的数据,而列表可以同时存储不同类型的数据。列表为什么没有数组这样的限制呢?
我们知道数组底层的存储结构是顺序存储结构,这样的结构有这样一些优点:逻辑上相邻的节点在物理位置上也是相邻的,可以节省空间,并且可以实现随机存取(也称直接访问)。创建一个数组时,会在内存中开辟一块固定长度的区域用于直接存储元素,扩容要考虑这块区域的后面是否有存储其他对象,所以数组在定义好之后就无法扩容了。而且在查询时,是根据索引和元素存储大小去计算地址偏移量的,如果元素类型不一致,所占内存空间不相同,就不能实现随机存储,所以数组不能同时存储不同类型的数据;而列表就不同了,它存储的是每个元素在内存中的地址(即引用),当列表中空白占位低于1/3时,会在内存中开辟一块更大的空间,并将旧列表中存储的地址复制到新列表中,旧列表则被销毁,这样就实现了扩容。因为列表存储的是元素的引用这个特性,而引用所占的内存空间是相同的,这样便可以同时存放不同类型的数据了。
Python中的字典底层是通过散列表(哈希表)来实现的, “哈希表是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。”
   字典本质也是一个数组,但其索引是键经过散列函数处理后得到的散列值,散列函数的目的是使键均匀地分布在散列表中,并且可以在内存中以O(1)的时间复杂度进行寻址,从而实现快速查找和修改。散列表其实是一个稀疏数组(总是有空白元素的数组称为稀疏数组),散列表里的单元通常叫作表元。在字典的散列表当中,每个键值对都占用一个表元,每个表元都有两个部分,一个是对键的引用,另一个是对值的引用。散列表中散列函数的设计困难在于将数据均匀分布在散列表中,从而尽量减少散列碰撞和冲突(散列冲突指的是在查询过程中通过索引定位到有值的表元时,发现该位置的key和查询的key不相等。高级的散列函数能够使冲突数目最小化。散列冲突在这里不过多描述)。
字典数据的添加和查询过程如下:1)添加:把key通过散列函数转换成一个整型数字(即散列值),把这个值最低的几位数字当作数组存储value的下标,最后再存储value到数组中;2)查询:使用散列函数将key转换为数组的下标,并定位到数组对应位置获取value。
    字典为什么是无序的?字典的无序是由两方面构成的:1)上面有说过Python中列表会设法保证大概还有1/3的表元是空的,所以快要达到这个阀值时,原有的散列表会被复制到一个更大的空间中去。在这个过程中会重新对字典的键进行散列化(散列表的大小增加了,那散列值所占位数和用作索引的位数都会随之增加,这样做的目的是为了减少发生散列冲突的概率),生成新的散列值,此时由于散列值的不同,则可能导致键的次序不同;2)另一方面就是就是散列冲突,当添加新键时发生散列冲突(即新键通过散列函数处理得到的散列值和字典中其他键的散列值相同,则需要在散列值中另外再取几位,然后用特殊的方法处理一下,把新得到的数字当作索引来寻找空的表元),新键可能会被安排到另一个位置,于是新添加的元素可能就跑到前面去了。
最后再说一点,因为字典的存储使用了散列表,为了减少散列冲突发生概率,散列表必须是稀疏的,所以字典在内存上的开销是很大的。
    Python中列表和字典在时间复杂度的比较
list
dict 
查询
查找某个元素的索引:O(1)
搜索某个元素:O(n)
获取某个元素: O(1)
根据键搜索:O(1)
添加
尾部添加:O(1)
任意位置添加:O(n)
键添加:O(1)
删除
尾部删除:O(1)
根据键来删除:O(1)
修改
索引赋值:O(1)
键赋值:O(1)

转载于:https://www.cnblogs.com/pcwuj/p/10782570.html

Python列表和字典的本质和区别相关推荐

  1. Python列表,元组,字典的区别

    Python列表,元组,字典的区别: 1.元组是不可变的, 而列表.字典是可变的.元组是不可变对象,对象一旦生成,它的值将不能更改:列表是可变对象,对象生成后,可以对其元素进行更改.添加.删除.清空. ...

  2. python列表、字典、元组的用法及区别_python列表,字典,元组简单用法示例

    本文实例讲述了python列表,字典,元组简单用法.分享给大家供大家参考,具体如下: 列表 #_*_ coding:utf-8 _*_ # 列表,定义在方括号的形式中,可以进行切片操作. #它没有固定 ...

  3. python列表元组字典集合实验心得_python学习小总结(列表、元组、字典、集合、字符串)...

    ---恢复内容开始--- 一.列表(list) 1.添加 append():追加,在列表末尾添加元素. 列表名.append(添加的元素) extend():扩展,在列表末尾添加元素. 列表名.ext ...

  4. 1.3 Python列表、字典、集合和JSON四种数据类型

    Applications of Deep Neural Networks with Keras 基于Keras的深度神经网络应用 著:Jeff Heaton 译:人工智能学术前沿 目录 1.Pytho ...

  5. python 列表、字典转json字符串

    python 列表.字典转json字符串 代码 import json data1 = [ { 'a' : 1, 'b' : 2, 'c' : 3, 'd' : 4, 'e' : 5 } ] data ...

  6. python列表生成字典_Python 列表生成式 字典生成式

    Python 列表生成式 & 字典生成式 通过生成式可以更加简洁地生成列表和字典 列表生成式 对比 直接生成数据后加入列表示例: user_list = list() for i in ran ...

  7. python列表嵌套字典取值_Python基础语法:你不得不知的几种变量类型

    (点击上方快速关注并设置为星标,一起学Python) 作者:kina_chen來源:简书 01. Python编码Python中默认的编码格式是 ASCII 格式,在没修改编码格式时无法正确打印汉字, ...

  8. python列表和字典_2020/11/18 python学习第5课 列表和字典

    python学习第5课 列表和字典 课程目标 熟练掌握列表.字典中元素的增删改查 理解列表和字典的区别 课程难点 列表与字典增删改查的异同 正确使用切片,深刻理解切片时冒号左右数字的意义 课程知识点总 ...

  9. Python 列表、字典、元组的一些小技巧

    1. 字典排序 我们知道 Python 的内置 dictionary 数据类型是无序的,通过 key 来获取对应的 value.可是有时我们需要对 dictionary 中的 item 进行排序输出, ...

最新文章

  1. shell脚本常用的4种流程控制语句
  2. Tensorflow 10分钟快速上手
  3. flinksql获取系统当前时间搓_DNF:从剑魂角度看工作服,不仅不是地摊货,更是超越了手搓套...
  4. 秒懂词向量Word2vec的本质
  5. Kaggle实战:点击率预估
  6. 最长平台(信息学奥赛一本通-T1116)
  7. Delphi版 IsNumeric 函数
  8. html 有序无序列表
  9. php 二级导航,导航下面的二级导航,显示和隐藏,
  10. 图扑软件基于钻孔数据的三维地质模型可视化
  11. 执行Transact-SQL语句或批处理时发生异常
  12. IC EMC(集成电路电磁兼容)测试标准介绍
  13. 大数据十大“关键词”
  14. 第三章:可行性研究及需求分析
  15. 这些「知识点」,你 Get 到了吗?【本周神经回顾】
  16. 游戏计算机性能要求吗,玩电脑大型游戏对于配置有什么要求
  17. NGS各种组学建库原理(图解)
  18. SpaceX 星链卫星互联网业务出现大规模宕机,现已修复
  19. 《Hadoop权威指南》---初识Hadoop
  20. SIEMENS/西门子1214 PID/通信模板 西门子P SIEMENS/西门子1214 PID/通信模板

热门文章

  1. python平稳性检验_Python中非平稳时间序列的处理
  2. weblogic 文件打开数_WebLogic任意文件上传漏洞(CVE20192618)复现
  3. python里default_新手对python default不是很理解它有什么用途
  4. linux巡检脚本生成word,Linux 编写安全巡检脚本
  5. 大学生学java要去培训机构吗?
  6. 计算机网络令牌总线在哪一页,计算机网络应用基础综合练习
  7. linux装回windows系统,将全盘安装的linux换回windows
  8. NYOJ-苹果(dp)
  9. Python三:面向对象 之 类的封装
  10. ModuleNotFoundError: No module named ‘pycocotools‘