前言
既然上一篇博文学习了namedtuple转换为OrderedDict。那么本篇博文就直接讲解OrderedDict数据结构的用法。
初始OrderedDict
OrderedDict顾名思义也是一个字典,不过它是字典的子类。相对于普通的字典,它可以记住其内容增加的顺序。
我们来看看普通字典的创建于OrderedDict字典的创建方式对比:
import collections print("普通Dict:") a = {} a['a'] = 'A' a['b'] = 'B' a['c'] = 'C' for key, value in a.items(): print(key, value) print("OrderedDict:") b = collections.OrderedDict() b['a'] = 'A' b['b'] = 'B' b['c'] = 'C' for key, value in b.items(): print(key, value)
运行之后,效果如下:
可以看到,普通字典与OrderedDict无非就是构造函数不一样,其他的遍历赋值等几乎都是一摸一样的。那么,OrderedDict字典存在的意义又是什么呢?
相等性
其实,我们开头说了,OrderedDict字典能够记住内容被增加的顺序。这里,我们来做一个有趣的实验,假设有2个普通的字典与2个OrderedDict字典,创建其字典是,仅仅只是赋值顺序不同,我们来看看效果:
import collections print("普通Dict:") a = {} a['a'] = 'A' a['b'] = 'B' a['c'] = 'C' b = {} b['c'] = 'C' b['b'] = 'B' b['a'] = 'A' print("是否相等:", a == b) print("OrderedDict:") c = collections.OrderedDict() c['a'] = 'A' c['b'] = 'B' c['c'] = 'C' d = collections.OrderedDict() d['c'] = 'C' d['b'] = 'B' d['a'] = 'A' print("是否相等:", c == d)
运行之后,效果如下:
可以看到,普通字典只要内容相同,不管其添加顺序如何,都能相等。而OrderedDict字典哪怕内容相同,只要顺序不同,都判断为不相等。因为OrderedDict字典检查其相等性时,会查看器内容的增加顺序,普通字典则不会。
move_to_end()
在普通的字典中,如果想移动某个元素到开头或者末尾,往往我们需要借助lambda表达式进行操作。而OrderedDict字典提供了函数move_to_end()可以很方便的将元素移动到开头或者结尾,具体操作如下:
import collections c = collections.OrderedDict() c['a'] = 'A' c['b'] = 'B' c['c'] = 'C' print("最初字典顺序") for key, value in c.items(): print(key, value) print('指定元素移动到末尾') c.move_to_end('b') for key, value in c.items(): print(key, value) print('指定元素移动到开头') c.move_to_end('b', last=False) for key, value in c.items(): print(key, value)
运行之后,效果如下:
可以看到当move_to_end第2个参数为True时,默认移动到末尾;当move_to_end第2个参数为False时,默认移动到开头。