首先要了解字典的实现原理
字典底层是以哈希表实现的,哈希表不存在顺序概念 (哈希表中的数据是按照哈希函数计算得到的索引位置存储的,而哈希函数本身并不保证元素的顺序性。因此,在通常情况下,哈希表中的元素是无序的 ) ,所以字典本质上也是无序的 但是在python中3.7之前的字典实现方式和之后的实现方式略有不同,3.7之前 字典输出的顺序是按照创建时值的顺序排列的,但是循环遍历时不能按照顺序输出,如果更改字典的值 哈希值的顺序也可能会改变,所以说字典是无序的,3.7之后字典的哈希表储存方式有所改变 增加了哈希表的下标位置来取对应的值,就避免了 3.6更改字典值导致哈希表顺序变化的问题(输出和循环遍历时可以按照插入值的顺序进行排序)但他本质还是无序的因为字典无法像列表或元组那样使用sort进行排序,
如果有特殊场景需要使用dict类型但又要对他的值(key)进行排序可以使用类型转换或者使用
OrderedDict 类型
元素顺序:dict 是无序的,而 OrderedDict 则是有序的。
在字典中,元素的顺序是不确定的(这个有版本之分3.6和3.7第三条进行补充),并且不能通过索引来访问字典中的元素。而在有序字典中,元素按照插入顺序排序,并且可以通过索引来访问特定位置的元素。
内部实现方式:dict 使用哈希表来存储键值对,而 OrderedDict 则使用哈希表和双向链表来存储键值对。
在字典中,键通过哈希函数计算其哈希值,并将该键值对存储在哈希表的相应位置上。而在有序字典中,除了哈希表之外,还维护了一个双向链表,用于记录键值对的插入顺序。这样,我们可以通过遍历链表来获取元素的顺序,或者通过插入节点到链表头部来更改元素的顺序。
在字典中,元素的顺序是不确定的,更严谨点 3.7之后的版本元素的顺序不论是输出还是遍历都是根据元素的插入顺序排列的
在 Python 3.7 及以后版本中,字典(dict)类型是有序的。这意味着,在遍历时会按照元素插入顺序输出,并且保持元素的插入顺序。这是因为在 Python 3.7 中,字典实现方式发生了改变,引入了一种新的算法“插入顺序”(insertion order)。
但在 Python 3.6 及之前版本中,字典是无序的,元素的顺序是不确定的,并且可能随着插入新的键值对而改变。因为字典的内部实现方式是哈希表(hash table),它们不能维护元素插入的顺序。即使按照特定顺序插入键-值对,哈希表也有可能会以其自己的方式重新排列元素,导致输出顺序的不确定性。
因此,如果需要字典保持有序,建议使用 Python 3.7 及以上版本,并且仅依赖于遍历字典时的有序性。但它并不意味着字典(dict)是完全排序的。字典的主要目的是提供一种快速查找键的方式,如果需要更强的排序功能如sort,可以考虑使用 collections 模块中的 OrderedDict 类型或者将字典转换为列表进行操作。