问题
在访问或者序列化字典时控制排序。
解决方法
使用collections
模块中的OrderedDict
,它保持字典插入时的排序:
from collections import OrderedDict
d = OrderedDict()
d['foo'] = 1
d['bar'] = 2
d['spam'] = 3
d['grok'] = 4
# Outputs "foo 1", "bar 2", "spam 3", "grok 4"
for key in d:
print(key, d[key])
当你想创建一个map并稍后序列化它或者想把它编码成其他格式的时候,OrderedDict
非常有用。比如你想精确的控制JSON中的field的顺序,这样做就行:
>>> import json
>>> json.dumps(d)
'{"foo": 1, "bar": 2, "spam": 3, "grok": 4}'
>>>
讨论
OrderedDict
内部维护一个双链接list来保证key按照插入顺序排序。当新的元素插入时被放置在list末尾。后续的重置已存在的key并不影响排序。
需要注意的是OrderedDict
的size比正常的字典要超出2倍,因为它创建了额外的链接list。因此,如果你要建立很大的字典,你得计算一下使用它的代价。