OrderedDict 有序字典以及读取json串时如何保持原有顺序
OrderedDict是dict的子类,它记住了内容添加的顺序。
比较时,OrderedDict要内容和顺序完全相同才会视为相等。
示例:
import collections
d = collections.OrderedDict()
d[3] = 'A'
d[2] = 'B'
d[1] = 'C'
for k, v in d.items():
print k, v
结果:
3 A
2 B
1 C
而如果d是一般的dict,则结果是:
1 C
2 B
3 A
2.读取json串时如何保持原有顺序
import json
from collections import OrderedDict
metadata = json.loads(text, object_pairs_hook=OrderedDict);
metadata中properties的顺序是跟text中定义的顺序是一样的。
具体可以看python文档中json.loads函数中的参数
Python 3.6改写了dict的内部算法,因此3.6的dict是有序的,在此版本之前皆是无序(写答案当前最新版为3.6)可参考阅读PEP 468根据PEP 468,此项改进降低了dict的内存消耗大概20%-25%(对比Python 3.5)注意3.6的dict遵循的顺序是Key的插入顺序。也就是说需要用一定顺序插入才能获得排好的结果,否则依然需要sort。另外,同样是Hash表实现的set在3.6里也依然是无序状态,这个没改最后,低版本希望有序dict可以用collections.OrderedDict。这是早在2.7就实装了的容器。它同样是遵循插入顺序。
作者:絢瀬絵里
链接:https://www.zhihu.com/question/24306558/answer/374075597
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
字典的本质是hash表
hash表的数据结构注定它就是无序的。
至于hash表的内部结构以及实现,可以参考《算法导论》。
作者:无名氏
链接:https://www.zhihu.com/question/24306558/answer/27358613
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
那本书都写了啥…(以下用Hash 简称 Hash Table)Hash的思想很简单, 就是跟 index sorting 一个内核, 申请一个Array, 并将Array的位置作为一种元数据在 index 排序的时候, 很朴素的, 数值的大小就是 放入array的位置,举个例子 我有int A[6], 我要排序 2 5 4 8将这些数分别放入Array的2 5 4 8位, 然后按顺序读出, 数列就以O(n)的速度排列完了Hash 和 Index 不同的是, 从数值到Array位置的映射是不一样的, 在Index sorting中, 数值在Array的位置就是数值本身在Hash中, 是变化的算法, 用Key算出在Array的位置, 放入Value比如我的Key是10, 在Hash中, 可能会把Value放到Array位置2上在这种算法下, 插入顺序是不可估计的.第一次操作, Key 2 Value 90 插入到 Hash Table A, 算出来位置是 5第二次操作, Key 9 Value 10 插入到 Hash Table A, 算出来位置是 3你发现了没有, Hash Table根本不保证插入的顺序后来的数据是可以跑到先插入的数据前面去的.Hash的本质是, 将一数列作为Key尽量平均分配另一个数列Value到程序已经申请好的Array上.最后说点无关的, 也会导致字典乱序的原因. Python会自动扩容字典.