创建一键多值字典(multidict)及对字典排序

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。

    原文作者:cook__
    原文地址: https://www.jianshu.com/p/308a1dc4cf78
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞