返回顶部
首页 > 资讯 > 后端开发 > Python >Python3.6之后字典是有序的?
  • 381
分享到

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

2024-04-02 19:04:59 381人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

字典的本质就是 hash 表,hash 表就是通过 key 找到其 value ,平均情况下你只需要花费 O(1) 的时间复杂度即可以完成对一个元素的查找,字典是否有序,并不是指字典

字典的本质就是 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字典有序性内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Python3.6之后字典是有序的?

本文链接: https://lsjlt.com/news/159578.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Python3.6之后字典是有序的?
    字典的本质就是 hash 表,hash 表就是通过 key 找到其 value ,平均情况下你只需要花费 O(1) 的时间复杂度即可以完成对一个元素的查找,字典是否有序,并不是指字典...
    99+
    2024-04-02
  • python3.7的字典是有序的
    旧结构 python3.7之前的字典结构,经典粗暴的hash表实现方式,这样的话每次hash表的扩容和缩容都可能导致hash值的改变。 hash表容量更新的前后,它的键之间的相对顺序是会变化的,因此字典的元素是无序的。旧结构类似下面 -...
    99+
    2023-01-31
    字典
  • python有序字典
    最近的django开发中用到了有序字典,所以研究了一下,以下。示例:有序字典和通常字典类似,只是它可以记录元素插入其中的顺序,而一般字典是会以任意的顺序迭代的。普通字典:由上面的结果可以看出对普通字典进行遍历,输出结果是无序的。下面是有序字...
    99+
    2023-01-31
    字典 python
  • python中的有序字典
     字典是python开发中的一种常用的数据结构,但是它在迭代时并不是按照元素的顺序进行,可能在某些场景下无法满足我们的需求,这就引入了有序字典  OrderedDict是dict的子类,它记住了内容添加的顺序  OrderedDict在比较...
    99+
    2023-01-31
    字典 python
  • python模块简介之有序字典(OrderedDict)
    有序字典-OrderedDict简介 示例 有序字典和通常字典类似,只是它可以记录元素插入其中的顺序,而一般字典是会以任意的顺序迭代的。参见下面的例子: import collections prin...
    99+
    2022-06-04
    字典 模块 简介
  • Python中的字典到底是有序的吗
    之前写了文章介绍python中的列表和字典,在文章中描述到了python中的列表是有序的,字典是无序的,后来有粉丝在群里提醒我,说python3.6的版本之后,字典是有序的,因此,我...
    99+
    2024-04-02
  • python中实现有序字典
      我们应该会在实际使用中发现python的字典是无序的,譬如说这样>>> a = {'key1':'a','key2':'b','key3':'c','key4':'d','key5':'e'} >>>...
    99+
    2023-01-31
    字典 python
  • python字典排序的方法有哪些
    Python字典排序的方法有以下几种:1. 使用sorted()函数:可以使用sorted()函数对字典的键或值进行排序。例如,使用...
    99+
    2023-10-12
    python
  • Python的collections模块中的OrderedDict有序字典
    如同这个数据结构的名称所说的那样,它记录了每个键值对添加的顺序。 d = OrderedDict() d['a'] = 1 d['b'] = 10 d['c'] = 8 for letter in d:...
    99+
    2022-06-04
    字典 模块 Python
  • python中字典的排序(Ordered
    1 首先介绍一下 sorted() 函数:输入代码:print(help(sorted)), 查看函数用法 输出为:Help on built-in function sorted in module builtins:sorted(ite...
    99+
    2023-01-31
    字典 python Ordered
  • 理解Python字典的顺序
    问题内容 有人可以解释一下 python (v3.5) 字典是如何排序的吗? data = {"john": 23, "rick": 33, "mary": 63, "ron": 23...
    99+
    2024-02-09
    排列
  • java链表字典排序的方法是什么
    在Java中,可以使用Collections.sort()方法对链表进行字典排序。具体步骤如下: 创建一个链表LinkedList...
    99+
    2023-10-24
    java
  • Python字典和常规字典的区别是什么
    这篇文章主要讲解了“Python字典和常规字典的区别是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python字典和常规字典的区别是什么”吧!用一个实例来说明排序后的字典和常规字典之间...
    99+
    2023-06-17
  • C#集合之字典的用法
    字典表示一种复杂的数据结构,这种数据结构允许按照某个键来访问元素。字典也称为映射或散列表。字典的主要特性是能根据键快速查找值。也可以自由添加和删除元素,这有点像List<T&g...
    99+
    2024-04-02
  • 在Python中如何让字典保持有序
    目录1、如何让字典保持有序2、代码演示(1)OrderedDict有序字典简单使用(2)模拟编写竞赛答题1、如何让字典保持有序 实际案例: 某编程竞赛系统,对参赛选手编程解题进行计时...
    99+
    2024-04-02
  • 在Python中怎么让字典保持有序
    这篇文章主要介绍“在Python中怎么让字典保持有序”,在日常操作中,相信很多人在在Python中怎么让字典保持有序问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”在Python中怎么让字典保持有序”的疑惑有所...
    99+
    2023-06-30
  • python字典创建和排序的方法是什么
    在Python中,可以使用大括号({})来创建字典。字典是一种无序的键值对集合,可以用来存储任意类型的数据。创建字典的方法有两种:1...
    99+
    2023-10-12
    python
  • c语言经典习题之逆序字符串详解
    目录使用指针逆序字符串使用递归逆序字符串逆序带空格的字符串总结使用指针逆序字符串 思路: 给两个指针,left放在字符串左侧,right放在最后一个有效字符位置交换两个指针位置上的字...
    99+
    2024-04-02
  • Python之字典常用的方法一
    字典是Python提供的一种常用的数据结构,它用于存放具有映射关系的数据。是一种可变容器模型,且可存储任意类型对象。字典是一个无序、可变和有索引的集合。在 Python 中,字典用花括号编写{},拥有键值对即key和value组成,字典的每...
    99+
    2023-05-14
    数据 Python 字典
  • python字典指的是什么
    这篇文章主要介绍了python字典指的是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。python是什么意思Python是一种跨平台的、具有解释性、编译性、互动性和面向对...
    99+
    2023-06-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作