• 欢迎访问DBA的辛酸事儿,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站
  • 欢迎大家关注博主公众号:DBA的辛酸事儿
  • 博文中若有错误的地方,请大家指正,大家的指正是我前进的动力

Python之有序字典(OrderedDict)与 普通字典(dict)

python SEian.G 3年前 (2021-10-19) 2291次浏览 已收录 0个评论

之前我认为python中的字典是无序的,因为它是按照hash来存储的,最近开发过程中对数据序列化之后,返回了OrderedDict类型数据,返回数据格式如下

[OrderedDict([('id', 1), ('prop_code', u'mysql'), ('prop_name', u'MySQL测试'), ('prop_value', u'{"db_structure":"mysql","service_name":"xxxx-mysql.service.xxxx.local","service_port":"4306""topology":{"master":[{"ipaddr":"xx.xx.xx.xx","port":"4306"},{"ipaddr":"xx.xx.xx.xx","port":"4306"},...]}}'), ('prop_status', 1), ('create_time', '2021-10-12T18:45:50'), ('update_time', '2021-10-12T18:45:50'), ('memo', None)])]

下面简单看下OrderedDict和dict的区别:

Python 的基础数据类型中的字典类型分为:无序字典 与 有序字典 两种类型

1.无序字典(普通字典)

my_dict = dict()

my_dict["name"] = "test"
my_dict["age"] = 27
my_dict["girl"] = "bob"
my_dict["money"] = 100
my_dict["hourse"] = None

for key, value in my_dict.items():
  print(key, value)

输出:

money 100
girl bob
age 27
hourse None
name test

可以看见,遍历一个普通字典,返回的数据和定义字典时的字段顺序是不一致的。

注意:

Python3.6 改写了 dict 的内部算法,Python3.6 版本以后的 dict 是有序的,所以也就无须再关注 dict 顺序性的问题

2.有序字典

import collections

my_order_dict = collections.OrderedDict()
my_order_dict["name"] = "test"
my_order_dict["age"] = 27
my_order_dict["money"] = 100
my_order_dict["hourse"] = None

for key, value in my_order_dict.items():
        print(key, value)

输出:

name test
age 27
money 100
hourse None

有序字典可以按字典中元素的插入顺序来输出。

注意:

有序字典的作用只是记住元素插入顺序并按顺序输出。如果有序字典中的元素一开始就定义好了,后面没有插入元素这一动作,那么遍历有序字典,其输出结果仍然是无序的,因为缺少了有序插入这一条件,所以此时有序字典就失去了作用,所以有序字典一般用于动态添加并需要按添加顺序输出的时候。

如下面这个列子:

import collections

my_order_dict = collections.OrderedDict(name="test", age=27, money=100, hourse=None)
for key, value in my_order_dict.items():
    print(key, value)

输出:

hourse None
age 27
money 100
name test

发现输出还是无序的,因为在定义有序字典的同时也定义了初始值,没有存在按序添加的操作,所以有序字典是没有记录插入字段的顺序,最后遍历时,得到数据的顺序仍然是无序的。

Python之有序字典(OrderedDict)与 普通字典(dict)


如果您觉得本站对你有帮助,那么可以收藏和推荐本站,帮助本站更好地发展,在此谢过各位网友的支持。
转载请注明原文链接:Python之有序字典(OrderedDict)与 普通字典(dict)
喜欢 (0)
SEian.G
关于作者:
用心去记录工作,用心去感受生活,用心去学着成长;座右铭:苦练七十二变,笑对八十一难
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址