字典(dict)类型
在 Python 3.7 及以后版本中,字典(dict)类型是有序的。这意味着,在遍历时会按照元素插入顺序输出,并且保持元素的插入顺序。这是因为在 Python 3.7 中, 字典实现方式发生了改变,引入了一种新的算法“插入顺序”(insertion order)。
但在 Python 3.6 及之前版本中,字典是无序的(如果字典没有改变的话输出顺序可能和插入顺序保持一致),元素的顺序是不确定的,并且可能随着插入新的键值对而改变。因为字典的内部实现方式是哈希表(hash table),它们不能维护元素插入的顺序。即使按照特定顺序插入键-值对,哈希表也有可能会以其自己的方式重新排列元素,导致输出顺序的不确定性。
因此,如果需要字典保持有序,建议使用 Python 3.7 及以上版本,并且仅依赖于遍历字典时的有序性。虽然在遍历时保持了有序性,但它仍然是一种哈希表(hash table)数据结构,无法直接进行排序操作。意味着字典(dict)是无法完全排序的。字典的主要目的是提供一种快速查找键的方式,如果需要更强的排序功能如sort,可以考虑使用 collections 模块中的 OrderedDict 类型或者将字典转换为列表进行操作。
有序字典( OrderedDict)类型
- 元素顺序:dict 是无序的,而 OrderedDict 则是有序的。
在字典中,元素的顺序是不确定的(这个有版本之分参考上面字典(dict)类型说明),并且不能通过索引来访问字典中的元素。而在有序字典中,元素按照插入顺序排序,并且可以通过索引来访问特定位置的元素。 - 内部实现方式:dict 使用哈希表来存储键值对,而 OrderedDict 则使用哈希表和双向链表来存储键值对。
在字典中,键通过哈希函数计算其哈希值,并将该键值对存储在哈希表的相应位置上。而在有序字典中,除了哈希表之外,还维护了一个双向链表,用于记录键值对的插入顺序。这样,我们可以通过遍历链表来获取元素的顺序,或者通过插入节点到链表头部来更改元素的顺序。