- 字典排序
- 问题:
- 想要创建一个字典,并且在迭代或者序列化这个字典的时候,能控制元素的顺序。
- 解决方案:
- 为了能控制一个字典中元素的顺序,可以使用 collections 模块中的OrderedDict类。在迭代操作的时候它会保持元素被插入时的顺序,示例如下:
from collections import OrderedDict
def ordered_dict():
d = OrderedDict()
d["foo"] = 1
d["bar"] = 2
d["spam"] = 3
d["grok"] = 4
for key in d:
print(key,d[key])
- 想要构建一个将来需要序列化或者编码成其他格式的映射的时候,OrderDict是非常有用的。比如, 想精确控制 JSON 编码后字段的顺序,可以先用 OrderedDict 来构建这样的数据:
import json
d = {'banana':3,'apple':4,'pear':1,'orange':2}
json.dumps(d)
print(d)
kd = OrderedDict(sorted(d.items(),key = lambda t:t[0]))
print('key order')
print(kd)
vd = OrderedDict(sorted(d.items(),key = lambda t:t[1]))
print('value order')
print(vd)
print(type(vd))
- 讨论:
- OrderedDict内部维护着一个根据键入顺序排序的双向链表。每次当一个新的元素插进来的时候, 它会被放到链表的尾部。对一个已经村咋的键的重复赋值,不会改变键的顺序。
- 需要注意的是,一个 OrderedDict 的大小是一个普通字典的两倍,因为他内部维护着另外一个 链表。如果需要构建一个需要大量 OrderedDict 实例的数据结构的时候,那么就需要权衡一下是 否使用 OrderedDict 带来的好处要大过额外内存消耗的影响。