Python数据结构与算法(6)---OrderedDict

举报
择城终老 发表于 2021/07/27 00:38:25 2021/07/27
【摘要】 目录 前言初始OrderedDict相等性move_to_end() 前言 既然上一篇博文学习了namedtuple转换为OrderedDict。那么本篇博文就直接讲解OrderedDict数据结构的用法。 初始OrderedDict OrderedDict顾名思义也是一个字典,不过它是字典的子类。相对于普通的字典,它可以记住其内容增加的顺序。 我...

前言

既然上一篇博文学习了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)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

运行之后,效果如下:
对比

可以看到,普通字典与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)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

运行之后,效果如下:
相等性

可以看到,普通字典只要内容相同,不管其添加顺序如何,都能相等。而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)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

运行之后,效果如下:
效果

可以看到当move_to_end第2个参数为True时,默认移动到末尾;当move_to_end第2个参数为False时,默认移动到开头。

文章来源: liyuanjinglyj.blog.csdn.net,作者:李元静,版权归原作者所有,如需转载,请联系作者。

原文链接:liyuanjinglyj.blog.csdn.net/article/details/115825996

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。