Python collections.OrderedDict解决dict元素顺序问题

编程中遇到个问题,python json.loads时元素顺序可能会发生变化

这个对于一些需要使用元素顺序来做一些策略的代码来说是致命的。

在网上查了查,结合自己的知识总结一下。



使用dict时,Key是无序的。在对dict做迭代时,我们无法确定Key的顺序。

如果要保持Key的顺序,可以用OrderedDict。

OrderedDict的Key会按照插入的顺序排列,不是Key本身排序

 1 #coding=utf-8
 2
 3 import json
 4 import collections
 5
 6 my_dict = {}
 7 my_list = ["测试", "1324", "r4ge5"]
 8
 9 for i in my_list:
10     my_dict[i] = my_list[my_list.index(i)]
11
12 print "str1原串:"
13 str1 = json.dumps(my_dict, ensure_ascii=False)
14 print str1
15
16 print "对str1字符串进行loads后的结果:"
17 data_js = json.loads(str1)
18 print json.dumps(data_js, ensure_ascii=False).encode("utf8")
19
20 print "对str1字符串进行loads后的结果(使用OrderedDict):"
21 data_js = json.loads(str1, object_pairs_hook=collections.OrderedDict)
22 print json.dumps(data_js, ensure_ascii=False).encode("utf8")

执行结果:

str1原串:
{"测试": "测试", "r4ge5": "r4ge5", "1324": "1324"}
对str1字符串进行loads后的结果:
{"r4ge5": "r4ge5", "1324": "1324", "测试": "测试"}
对str1字符串进行loads后的结果(使用OrderedDict):
{"测试": "测试", "r4ge5": "r4ge5", "1324": "1324"}

 

更多可以参考:

https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001411031239400f7181f65f33a4623bc42276a605debf6000

时间: 2024-11-01 07:58:08

Python collections.OrderedDict解决dict元素顺序问题的相关文章

解决Python 遍历字典时删除元素报异常的问题_python

错误的代码① d = {'a':1, 'b':0, 'c':1, 'd':0} for key, val in d.items(): del(d[k]) 错误的代码② -- 对于Python3 d = {'a':1, 'b':0, 'c':1, 'd':0} for key, val in d.keys(): del(d[k]) 正确的代码 d = {'a':1, 'b':0, 'c':1, 'd':0} keys = list(d.keys()) for key, val in keys: d

Python collections模块实例讲解_python

collections模块基本介绍 我们都知道,Python拥有一些内置的数据类型,比如str, int, list, tuple, dict等, collections模块在这些内置数据类型的基础上,提供了几个额外的数据类型: 1.namedtuple(): 生成可以使用名字来访问元素内容的tuple子类2.deque: 双端队列,可以快速的从另外一侧追加和推出对象3.Counter: 计数器,主要用来计数4.OrderedDict: 有序字典5.defaultdict: 带有默认值的字典 n

python超简单解决约瑟夫环问题

  本文实例讲述了python超简单解决约瑟夫环问题的方法.分享给大家供大家参考.具体分析如下: 约瑟环问题大家都熟悉.题目是这样的.一共有三十个人,从1-30依次编号.每次隔9个人就踢出去一个人.求踢出的前十五个人的号码: 明显的约瑟夫环问题,python实现代码如下: ? 1 2 3 4 5 6 a = [ x for x in range(1,31) ] #生成编号 del_number = 8 #该删除的编号 for i in range(15): print a[del_number]

javascript-怎么动态增加元素顺序?

问题描述 怎么动态增加元素顺序? <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>JQuery Test</title> <script src="../behappy/jquery-2.1.4.min.js" charset="utf-8&q

Python解析xml中dom元素的方法_python

本文实例讲述了Python解析xml中dom元素的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: from xml.dom import minidom try:     xmlfile = open("path.xml", "a+")     #xmldoc = minidom.parse( sys.argv[1])     xmldoc = minidom.parse(xmlfile) except :     #updatelogger.

电子邮件-如何解决网页元素穿透?

问题描述 如何解决网页元素穿透? 如图:一个简单的登录页一个email框一个密码框一个图上被穿透的input(图片背景)如何解决? 解决方案 1.提示框和邮箱格式错误,可以通过z-index来解决 两个建议:1,邮箱格式错误提示应该在输入完成后,就是input失去焦点后再提示,2,如果非要在输入过程中判断,那么吧提示放在输入框后面2.密码框的那个眼睛,如果是浏览器自带的特性,这个就需要把代码贴出来慢慢调,如果是自己写的图片,同样也是通过z-index来解决 解决方案二: 这不是浏览器的问题吧,你

数组唯一key-2个数组元素顺序不同,认为是同一个数组

问题描述 2个数组元素顺序不同,认为是同一个数组 有2个数组比如[1,2,3,4]和[4,3,2,1],仅仅排序不同,有什么快速的算法认为是同一个数组? 或者数组元素能算出key,而此key和元素顺序无关. 求Java实现 解决方案 对它排序,然后比较,或者对数组求和,得到hash,如果和相同虽然不一定数组相同,但是和不同,一定不同,所以可以进一步筛选. 解决方案二: 如果数组没有重复,放到set中,然后直接比较set,就OK了 解决方案三: 要判断两个数组相同,而且还要考虑的数组元素是无序,最

栈队列问题---求退队元素顺序

问题描述 栈队列问题---求退队元素顺序 设有栈S和队列Q,初始状态均为空,首先依次将ABCDEF入栈,然后从栈中退出三个元素依次入队,再将XYZ入栈后将栈中所有元素退出并依次入队,最后将队列中所有元素退出,则退队元素的顺序为?? -------参考答案是DEFXYZABC,这个答案有问题吗?求大侠指点 解决方案 答案应该有问题. 首先S=ABCDEF,第二步:S=ABC,Q=FED,第三部:S=ABCXYZ,Q=FED,第四部:Q=FEDZYXCBA. 退队的顺序即为最后队列的顺序FEDZYX

Python去除列表中重复元素的方法_python

本文实例讲述了Python去除列表中重复元素的方法.分享给大家供大家参考.具体如下: 比较容易记忆的是用内置的set l1 = ['b','c','d','b','c','a','a'] l2 = list(set(l1)) print l2 还有一种据说速度更快的,没测试过两者的速度差别 l1 = ['b','c','d','b','c','a','a'] l2 = {}.fromkeys(l1).keys() print l2 这两种都有个缺点,祛除重复元素后排序变了: ['a', 'c',