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

python3.7的字典是有序的

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

北京

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

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

看不清楚,换张图片

免费获取短信验证码

python3.7的字典是有序的

旧结构

python3.7之前的字典结构,经典粗暴的hash表实现方式,这样的话每次hash表的扩容和缩容都可能导致hash值的改变。

hash表容量更新的前后,它的键之间的相对顺序是会变化的,因此字典的元素是无序的。旧结构类似下面

--+-------------------------------+
  | 哈希值 (hash)  键 (key)  值 (value)
--+-------------------------------+
0 |    hash0      key0    value0
--+-------------------------------+
1 |    hash1      key1    value1
--+-------------------------------+
2 |    hash2      key2    value2
--+-------------------------------+
. |           ...
__+_______________________________+

新结构

Indices
----------------------------------------------------
None | index0 | None | None | index2 | None | index1 ...
----------------------------------------------------

Entries
--------------------
hash0   key0  value0
---------------------
hash1   key1  value1
---------------------
hash2   key2  value2
---------------------
        ...
---------------------

新结构由 Indices(索引,数组实现) 和 Entries(实体,PyDictObject类型) 两种结构组成。

  • 当插入一个数据时,先计算数据对应的hash值并映射成 Indices 数组的一个下标,没有冲突的话就将另一个值 Entries_index(暂时这么叫吧) 填入Indices数组中下标对应的位置。并在Entries后面追加一行记录,类似 hash值, key值, value值 。如果冲突的话可以用基本的解决冲突的办法,这里不赘述了。

这种方法,字典 增删改查的时间复杂度 会有以前的O(1) 变为O(2),因为多了一步查找的过程。而且字典扩容和缩容时要按照Indices的顺序来保持字典始终有序。

但是至少有两个优化。

  • 字典占用的内存变小了。旧的字典总会预留大于 1/3的容量的hash位置,防止hash碰撞过多影响效率。现在则不必预留。
  • 字典有序了。

源码见:
dictobject.h

dictobject.c

记于:2019/07/23

免责声明:

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

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

python3.7的字典是有序的

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

下载Word文档

猜你喜欢

python3.7的字典是有序的

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

python中的有序字典

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

python有序字典

最近的django开发中用到了有序字典,所以研究了一下,以下。示例:有序字典和通常字典类似,只是它可以记录元素插入其中的顺序,而一般字典是会以任意的顺序迭代的。普通字典:由上面的结果可以看出对普通字典进行遍历,输出结果是无序的。下面是有序字
2023-01-31

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

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

python字典排序的方法有哪些

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

python中实现有序字典

我们应该会在实际使用中发现python的字典是无序的,譬如说这样>>> a = {'key1':'a','key2':'b','key3':'c','key4':'d','key5':'e'}>>> a{'key3': 'c', 'key2
2023-01-31

理解Python字典的顺序

问题内容有人可以解释一下 python (v3.5) 字典是如何排序的吗?data = {"john": 23, "rick": 33, "mary": 63, "ron": 23, "joel": 51}for key in data
理解Python字典的顺序
2024-02-09

python中字典的排序(Ordered

1 首先介绍一下 sorted() 函数:输入代码:print(help(sorted)), 查看函数用法 输出为:Help on built-in function sorted in module builtins:sorted(ite
2023-01-31

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

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

Python字典和常规字典的区别是什么

这篇文章主要讲解了“Python字典和常规字典的区别是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python字典和常规字典的区别是什么”吧!用一个实例来说明排序后的字典和常规字典之间
2023-06-17

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

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

python字典指的是什么

这篇文章主要介绍了python字典指的是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。python是什么意思Python是一种跨平台的、具有解释性、编译性、互动性和面向对
2023-06-14

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

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

python 编程中字典排序的方法

在python编写程序的过程中使用字典进行数据信息统计时,由于字典是无序的所以打印字典时内容也是无序的。因此,为了使统计得到的结果更方便查看需要进行排序。Python中字典的排序分为按“键”排序和按“值”排序。1.按“值”排序就是根据字典的
2023-01-31

Python的字典 { }

Python的字典属于一种数据类型,我们可以把数据存到字典里面,字典使用大括号“{}”来定义。比如现在要存储一个人的信息然后读取出来,就可以使用切片的方式来体现:In [1]: info ='Tom 180 Male'In [2]: inf
2023-01-31

在Python中怎么让字典保持有序

这篇文章主要介绍“在Python中怎么让字典保持有序”,在日常操作中,相信很多人在在Python中怎么让字典保持有序问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”在Python中怎么让字典保持有序”的疑惑有所
2023-06-30

编程热搜

  • 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动态编译

目录