1. Python OrderedDict字典概述
Python自带的dict数据类型是无序的,也就是说元素的排列很随意,每一次输出的顺序可能不尽相同。但在有些情况下,我们需要让字典保持元素的输入顺序不变,此时,Python的collections模块中的OrderedDict类就派上用场了。
OrderedDict是一个有序字典,可以根据元素的加入顺序来保持元素的顺序不变。
from collections import OrderedDict
d = OrderedDict()
d['a'] = 1
d['b'] = 2
d['c'] = 3
print(d) # OrderedDict([('a', 1), ('b', 2), ('c', 3)])
从上面的代码可以看出,OrderedDict可以通过items()方法把字典中元素按照添加顺序返回一个元组组成的列表。
2. Python OrderedDict字典排序方法
2.1 根据key排序
OrderedDict也可以按照key进行排序,这里介绍两种排序方法:
2.1.1 直接使用sorted函数
可以使用Python内置的sorted函数对OrderedDict进行排序,具体方式是将OrderedDict转化为一个列表,然后对列表进行排序,最后再使用OrderedDict重新创建一个有序字典。
d = {'banana': 3, 'apple': 4, 'pear': 1, 'orange': 2}
d_sorted_by_key = OrderedDict(sorted(d.items(), key=lambda t: t[0]))
print(d_sorted_by_key) # OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)])
2.1.2 使用collections模块中的OrderedDict内置方法sorted函数
同时,OrderedDict类还提供了一个sorted函数,可以直接使用该函数来排序。
d = {'banana': 3, 'apple': 4, 'pear': 1, 'orange': 2}
d_sorted_by_key = OrderedDict(sorted(d.items()))
print(d_sorted_by_key) # OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)])
2.2 根据value排序
OrderedDict也可以按照value进行排序,这里依旧介绍两种方法。
2.2.1 利用operator模块的itemgetter函数
利用Python的operator模块中的itemgetter函数,可以非常方便地根据字典的value进行排序。
from operator import itemgetter
d = {'banana': 3, 'apple': 4, 'pear': 1, 'orange': 2}
d_sorted_by_value = OrderedDict(sorted(d.items(), key=itemgetter(1)))
print(d_sorted_by_value) # OrderedDict([('pear', 1), ('orange', 2), ('banana', 3), ('apple', 4)])
从上面的代码可以看出,itemgetter函数可以传递一个参数,在这里是1,意味着根据每一个元组的第二个元素进行排序。
2.2.2 利用lambda表达式
利用lambda表达式也可以对字典的value进行排序,具体方法是将字典中的每一个元素转化为一个元组,在元组的第二个位置加入value值,然后根据value进行sorted排序。
d = {'banana': 3, 'apple': 4, 'pear': 1, 'orange': 2}
d_sorted_by_value = OrderedDict(sorted(d.items(), key=lambda t: t[1]))
print(d_sorted_by_value) # OrderedDict([('pear', 1), ('orange', 2), ('banana', 3), ('apple', 4)])
2.3 组合排序
对于OrderedDict,我们还可以根据key和value的组合进行排序,即先根据key进行排序,然后在每一个key内部根据value进行排序。
from operator import itemgetter
d = {'banana': 3, 'apple': 4, 'pear': 1, 'orange': 2, 'peach': 2}
d_sorted_by_key = OrderedDict(sorted(d.items(), key=lambda t: t[0]))
d_sorted_by_value = {key: d[key] for key in sorted(d, key=lambda k: d[k])}
result = OrderedDict((k, d_sorted_by_value[k]) for k in d_sorted_by_key.keys())
print(result) # OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('peach', 2), ('pear', 1)])
2.4 倒序排序
默认情况下,OrderedDict的排序是按照元素添加的顺序进行排序,也就是升序排序,如果需要进行倒序排序,可以设置reverse参数为True。
d = {'banana': 3, 'apple': 4, 'pear': 1, 'orange': 2}
d_sorted_by_key_reverse = OrderedDict(sorted(d.items(), reverse=True))
print(d_sorted_by_key_reverse) # OrderedDict([('pear', 1), ('orange', 2), ('banana', 3), ('apple', 4)])
3. 总结
本文介绍了Python的collections模块中的OrderedDict类以及排序方法,其中包括根据key排序、根据value排序、组合排序和倒序排序。OrderedDict是一个非常有用的数据类型,可以在需要按照元素添加顺序进行排序时发挥重要作用。