Python进阶编程:编写更高效、优雅的Python代码
上QQ阅读APP看书,第一时间看更新

3.2.3 字典排序

字典默认是无序的,但有时需要字典中元素保持原来的顺序。为了便于使用者控制字典中元素的顺序,collections模块提供了一个OrderedDict类。在迭代操作的时候,OrderedDict类会使元素保持被插入时的顺序,示例如下:


from collections import OrderedDict

ordered_dict = OrderedDict()
ordered_dict['a'] = 1
ordered_dict['b'] = 'abc'
ordered_dict['c'] = 'hello world'
ordered_dict['d'] = -5
for key in ordered_dict:
    print(f'get key is:{key}, value is:{ordered_dict[key]}')

当想要构建一个将来需要序列化或编码成其他格式的映射文件的时候,OrderedDict类是非常有用的。

如果想精确控制以JSON编码后的字段的顺序,可以先使用OrderedDict来构建字典数据,再进行JSON编码,在ordered_dict_exp.py文件中添加如下代码:


import json
print(json.dumps(ordered_dict))

OrderedDict类内部维护着一个根据键插入顺序排序的双向链表。当一个新的元素插入进来的时候,该元素会被放到链表的尾部,对已经存在的键的重复赋值不会改变键的顺序。

注意 OrderedDict类的大小是一个普通字典的2倍,因为它内部维护着另外一个链表。所以,在构建一个需要大量OrderedDict实例的数据结构的时候(比如读取1 000 000行CSV数据到一个OrderedDict类列表中去),我们就得慎重权衡使用OrderedDict类带来的好处是否大于额外内存消耗的影响。