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