我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python3.6之后字典是有序的?

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python3.6之后字典是有序的?

字典的本质就是 hash 表,hash 表就是通过 key 找到其 value ,平均情况下你只需要花费 O(1) 的时间复杂度即可以完成对一个元素的查找,字典是否有序,并不是指字典能否按照键或者值进行排序,而是字典能否按照插入键值的顺序输出对应的键值。

比如,对于一个无序字典,插入顺序和遍历的顺序是不一致的:


>>> my_dict = dict()
>>> my_dict["name"] = "lowman"
>>> my_dict["age"] = 26
>>> my_dict["girl"] = "Tailand"
>>> my_dict["money"] = 80
>>> my_dict["hourse"] = None
>>> for key,value in my_dict.items():
...     print(key,value)
...
money 80
girl Tailand
age 26
hourse None
name lowman


而一个有序字典的输出是这样的:


name lowman
age 26
girl Tailand
money 80
hourse None


那为什么 Python3.6 之后,Python 的字典就有序了呢?

先从 Python3.6 之前说起。在 Python 3.6 之前,其数据结构如下图所示:

由于不同键的哈希值不一样,哈希表(entries)中的顺序是按照哈希值大小排序的,遍历时从前往后遍历并不能输出键值插入的顺序,其表现起来就是无序的。

此外,这种方式还有一个缺点,就是如果以稀疏的哈希表存储时,会浪费较多的内存空间,Python3.6 之后,对其进行了优化,哈希索引和真正的键值对分开存放,数据结构如下所示:

indices 指向了一列索引,entries 指向了原本的存储哈希表内容的结构。

你可以把 indices 理解成新的简化版的哈希表,entries 理解成一个数组,数组中的每个元素是原本应该存储的哈希结果:键和值。

查找或者插入一个元素的时候,根据键的哈希值结果取模 indices 的长度,就能得到对应的数组下标,再根据对应的数组下标到 entries 中获取到对应的结果,比如 hash("key2") % 8 的结果是 3,那么 indices[3] 的值是 1,这时候到 entries 中找到对应的 entries[1] 既为所求的结果:

这么做的好处是空间利用率得到了较大的提升,我们以 64 位操作系统为例,每个指针的长度为 8 字节,则原本需要 8 * 3 * 8 为 192

现在变成了 8 * 3 * 3 + 1 * 8 为 80,节省了 58% 左右的内存空间,如下图所示:

此外,由于 entries 是按照插入顺序进行插入的数组,对字典进行遍历时能按照插入顺序进行遍历,这也是为什么 Python3.6 以后的版本字典对象是有序的原因。

最后:

如果你对 Python 解释器的实现感兴趣,可以阅读 CPython 的源码,源码之下无秘密,阅读源码也是提升自己最快的学习方式,这里推荐一个学习 CPython 的开源仓库 CPython-Internals,图文注释并茂,是非常有价值的学习资源

到此这篇关于Python3.6 之后字典是有序的?的文章就介绍到这了,更多相关Python字典有序性内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Python3.6之后字典是有序的?

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

python3.7的字典是有序的

旧结构python3.7之前的字典结构,经典粗暴的hash表实现方式,这样的话每次hash表的扩容和缩容都可能导致hash值的改变。hash表容量更新的前后,它的键之间的相对顺序是会变化的,因此字典的元素是无序的。旧结构类似下面--+---
2023-01-31

python中的有序字典

字典是python开发中的一种常用的数据结构,但是它在迭代时并不是按照元素的顺序进行,可能在某些场景下无法满足我们的需求,这就引入了有序字典  OrderedDict是dict的子类,它记住了内容添加的顺序  OrderedDict在比较时
2023-01-31

python模块简介之有序字典(OrderedDict)

有序字典-OrderedDict简介 示例 有序字典和通常字典类似,只是它可以记录元素插入其中的顺序,而一般字典是会以任意的顺序迭代的。参见下面的例子:import collectionsprint 'Regular dictionary:
2022-06-04

python字典排序的方法有哪些

Python字典排序的方法有以下几种:1. 使用sorted()函数:可以使用sorted()函数对字典的键或值进行排序。例如,使用sorted()函数对字典的键进行排序:```pythond = {'b': 2, 'a': 1, 'c':
2023-10-12

Python的collections模块中的OrderedDict有序字典

如同这个数据结构的名称所说的那样,它记录了每个键值对添加的顺序。d = OrderedDict() d['a'] = 1 d['b'] = 10 d['c'] = 8 for letter in d:print letter输出: a
2022-06-04

java链表字典排序的方法是什么

在Java中,可以使用Collections.sort()方法对链表进行字典排序。具体步骤如下:创建一个链表LinkedList对象,并添加需要排序的元素。使用Collections.sort()方法对链表进行排序。该方法接受一个List
2023-10-24

python字典创建和排序的方法是什么

在Python中,可以使用大括号({})来创建字典。字典是一种无序的键值对集合,可以用来存储任意类型的数据。创建字典的方法有两种:1. 直接赋值法:```pythonmy_dict = {'key1': value1, 'key2': va
2023-10-12

简单总结Python中序列与字典的相同和不同之处

共同点: 1.它们都是python的核心类型,是python语言自身的一部分 核心类型与非核心类型 多数核心类型可通过特定语法来生成其对象,比如"dave"就是创建字符串类型的对象的表达式; 非核心类型需要内置函数来创建,比如文件类型
2022-06-04

Python中的字典与JSON之间的相互转换方法有哪些?

Python中的字典与JSON之间的相互转换方法有哪些?作为一种十分常用的数据结构,字典在Python中被广泛应用。而JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,也被广泛应用于网络数据传输和
2023-10-22

程序员:有些事,是等你做了领导以后才明白的

经常提到有的伙伴抱怨:我们技术总监一会儿换个需求,朝令夕改的,可是程序都写了一半了。。。我们架构师整天不敲一个代码的,净听他bb了。。。其实身在其位,每个人都有每个人不得已的地方,这个时候,我们该换个位置来想了。也许,有些时候,你只有真正坐
2023-06-02

MybatisPlus分页排序查询字段带有下划线的解决方法是什么

这篇文章主要讲解了“MybatisPlus分页排序查询字段带有下划线的解决方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MybatisPlus分页排序查询字段带有下划线的解决方法是
2023-06-21

微信小程序 - 最新获取用户昵称 / 头像(wx.getUserProfile 接口被废弃后的代替方案)详细教程,2022 年之后的所有微信小程序,获取用户信息最新详细教程,附带示例源代码

前言 由于官方修改了 “用户头像昵称获取规则” ,导致网上几乎所有教程全部失效,本文来做最新详细教程。 2022 年往后(官方废弃了 wx.getUserProfile 接口),本文是最新微信获取用户头像和昵称的详细教程, 您可以直接
2023-08-18

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录