python字典键值顺序?

Python中字典是一个非常常用的数据结构,其提供了快速查找和插入的功能,但是很多程序员却对Python字典的排序机制存在疑惑,本文将从不同的角度对Python字典键值的顺序进行分析,包括:
【python字典键值顺序?】

python字典键值顺序?

文章插图
1. Python字典键值的存储方式
2. Python版本对字典键值顺序的影响
3. 字典推导式、字典的键、值排序及其他方法
Python字典键值的存储方式
Python字典的底层实现是hashtable,使用hash算法来存储键值对 。所以字典中的键和值并没有存储在一起,而是分别存储在内存不同的位置,同时Python字典还是一种动态数据结构,其可动态地调整大?。?以处理不同大小的键值对 。而单个哈希桶(hash table)是一个一维数组,字典中的每个键值对都存储在这个哈希桶中的一个条目(entry)中,每个条目由两个部分组成,一个指向键对象,一个指向值对象 。
Python版本对字典键值顺序的影响
在不同的Python版本中 , 字典键值的顺序是有所不同的,下面我们来逐一探讨:
Python 3.6及之前版本
在Python 3.6以前的版本中,字典的键值对是按照它们添加的顺序进行存储的 。也就是说,如果先添加a键值对,再添加b键值对,Python会先在哈希桶中插入a的条目,然后插入b的条目 。因此字典中的键值对并不是按照哈希值或者其他方法来排序的 , 而是按照它们添加时的顺序来排列的 。下面我们通过一个简单的例子来说明:
>>> d = {}
>>> d['a'] = 1
>>> d['b'] = 2
>>> d
{'a': 1, 'b': 2}
Python 3.7及以上版本
在Python 3.7及以上版本 , 字典的键值对顺序是有保证的,且是按照哈希值的大小顺序排列的 。这个改动主要是为了提高字典在某些场景下的性能,由于哈希值是一个数字,Python可以通过对这些数字进行排序来快速反转键值对的顺序 。这个特性在Python3.7中被加入,在以后的版本中得到了保留 。
字典推导式、字典的键、值排序及其他方法
1. 字典推导式
字典推导式也被称为字典生成式,其使用类似于列表推导式的语法,可以快速生成一个字典 。下面是一个简单的例子:
>>> d = {i: i*2 for i in range(5)}
>>> d
{0: 0, 1: 2, 2: 4, 3: 6, 4: 8}
2. 字典的键、值排序
对于字典的键,可以调用sorted()函数进行升序排序,如果需要降序排序 , 可以使用reverse参数进行反转,下面是一个例子:
>>> d = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
>>> sorted(d.keys())
['a', 'b', 'c', 'd']
>>> sorted(d.keys(), reverse=True)
['d', 'c', 'b', 'a']
对于字典的值,可以使用sorted()函数结合key参数进行排序,下面是一个例子:
>>> d = {'a': 1, 'b': 4, 'c': 2, 'd': 3}
>>> sorted(d, key=d.get)
['a', 'c', 'd', 'b']
3. 其他方法
还有其他一些方法可以对字典的键值对进行排序 , 其中最常用的是使用collections模块的ordereddict类,该类实现了在Python3.7之前的版本中的保序字典,可以保证字典的键值对按照添加顺序进行排序 。
结论
Python字典是一个非常实用的数据结构,在实际的编程中往往要用到它进行数据的存储和查找 , 然而其键值对的顺序却很容易被理解错,本文详细分析了Python字典键值顺序的存储方式、不同版本的影响以及各种排序方法 , 相信大家对Python字典的顺序问题已经有了更深入的了解 。

    推荐阅读