multidict
一般的创建一键多值字典的方法如下:
# 保留元素插入顺序,则用列表
d = {
'a': [1, 2, 3],
'b': [4, 5]
}
# 消除重复的元素(而不在意他们的顺序),则用集合
e = {
'a': {1, 2, 3},
'b': {4, 5}
}
下面使用collections.defaultdict来创建字典:
from collections import defaultdict
d = defaultdict(list) # dict的value是list类型
d['a'].append(1)
d['a'].append(2)
d['b'].append(3)
d
Out[18]: defaultdict(list, {'a': [1, 2], 'b': [3]})
d = defaultdict(set)
d['c'].add(1)
d['c'].add(2)
d['d'].add(3)
d
Out[20]: defaultdict(set, {'c': {1, 2}, 'd': {3}})
因此对defaultdict类型的字典做更新操作更方便了:
d
Out[22]: defaultdict(list, {'a': [1, 2], 'b': [3]})
for k, v in d.items():
d[k].append(v)
d
Out[24]: defaultdict(list, {'a': [1, 2, [...]], 'b': [3, [...]]})
对字典排序
使用collections.OrderedDict类来创建有序字典:
from collections import OrderedDict
d = OrderedDict()
d['a'] = 1
d['b'] = 2
d['c'] = 3
d
Out[7]: OrderedDict([('a', 1), ('b', 2), ('c', 3)])
有序字典的使用示例:
data = {'a': 1, 'c': 2, 'd': 3, 'b': 4}
d = OrderedDict([key, data[key]] for key in sorted(data.keys()))
d
Out[10]: OrderedDict([('a', 1), ('b', 4), ('c', 2), ('d', 3)]) # 排序后
import json
json.dumps(d)
Out[12]: '{"a": 1, "b": 4, "c": 2, "d": 3}'
注意:
1、OrderedDict内部维护了一个双向链表,它会根据元素的加入顺序来排列键的位置。
2、OrderedDict的大小是普通字典的两倍多,这是由于额外创建的链表所致。
3、实际应用中根据数据量大小来衡量是否采用OrderedDict。