Python OrderedDict字典排序方法详解

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是一个非常有用的数据类型,可以在需要按照元素添加顺序进行排序时发挥重要作用。

后端开发标签