2.3.4 使用OrderedDict创建有序字典

在Python程序中创建一个字典后,不但可以对字典进行迭代或序列化操作,而且也能控制其中元素的排列顺序。下面的实例文件youxu.py演示了创建有序字典的过程。

源码路径:daima\第2章\youxu.py

import collections
dic = collections.OrderedDict()
dic['k1'] = 'v1'
dic['k2'] = 'v2'
dic['k3'] = 'v3'
print(dic)

执行后会输出:

OrderedDict([('k1', 'v1'), ('k2', 'v2'), ('k3', 'v3')])

再看下面的实例文件qingkong.py,它演示了清空有序字典中数据的过程。

源码路径:daima\第2章\qingkong.py

import collections
dic = collections.OrderedDict()
dic['k1'] = 'v1'
dic['k2'] = 'v2'
dic.clear()
print(dic)

执行后会输出:

OrderedDict()

再看下面的实例文件xianjin.py,功能是使用函数popitem()按照后进先出原则,删除最后加入的元素并返回键值对。

源码路径:daima\第2章\xianjin.py

import collections
dic = collections.OrderedDict()
dic['k1'] = 'v1'
dic['k2'] = 'v2'
dic['k3'] = 'v3'
print(dic.popitem(),dic)
print(dic.popitem(),dic)

执行后会输出:

('k3', 'v3') OrderedDict([('k1', 'v1'), ('k2', 'v2')])
('k2', 'v2') OrderedDict([('k1', 'v1')])

注意:在Python的OrderedDict内部维护了一个双向链表,它会根据元素加入的顺序来排列键的位置。第1个新加入的元素被放置在链表的末尾,接下来会对已存在的键重新赋值而不会改变键的顺序。开发者需要注意的是,OrderedDict的大小是普通字典的两倍多,这是由于额外创建的链表所致。因此,如果想构建一个涉及大量OrderedDict实例的数据结构(例如从CSV文件中读取100000行内容到OrderedDict列表中),那么需要认真对应用做需求分析,从而推断出使用OrderedDict所能带来的好处是否能大过因额外的内存开销而带来的损失。