将OrderedDict转换为正常的dict保留顺序?

时间:2014-05-31 02:37:56

标签: python json string dictionary ordereddictionary

如何在保留相同顺序的同时将OrderedDict转换为普通字典?

我问这个的原因是因为当我从API获取数据时,我得到一个JSON字符串,我在其中使用json.loads(str)来返回字典。从json.loads(...)返回的这个词典只是乱序,随机排序。另外,我已经读过OrderedDict使用起来很慢,所以我希望使用与原始JSON字符串相同顺序的常规字典。

稍微偏离主题:是否仍然使用json.loads(...)将JSON字符串转换为字典,同时在不使用collections.OrderedDict的情况下保持相同的顺序?

2 个答案:

答案 0 :(得分:5)

当您将OrderedDict转换为普通dict时,您无法保证排序将被保留,因为dicts是无序的。这就是为什么OrderedDict首先存在的原因。

在这里,你似乎想要吃蛋糕并吃掉它。如果您希望保留JSON字符串的顺序,请使用我在注释中链接到的问题的答案将json字符串直接加载到OrderedDict。但是你必须处理所带来的任何性能损失(我不知道该惩罚是什么。对于你的用例,它甚至可能是可以忽略不计的。)。如果您想获得最佳性能,请使用dict。但它将是无序的。

答案 1 :(得分:1)

JSON对象和Python dicts都是无序的。要保留顺序,请使用映射到Python列表的JSON数组。 JSON数组的元素应该是JSON对象。这些将映射到Python dicts的Python列表。

Python 3:

from collections import OrderedDict
import json

# Preserving order in Python dict:
ordered_dict = OrderedDict([
    ('a', 1),
    ('b', 2),
    ('c', 3),
])

# Convert to JSON while preserving order:
ordered_list = [{key: val} for key, val in ordered_dict.items()]
json.dumps(ordered_list)
# '[{"a": 1}, {"b": 2}, {"c": 3}]'

Javascript(JSON):

var orderedListStr = '[{"a": 1}, {"b": 2}, {"c": 3}]';
// We will receive this array of objects with preserved order:
var orderedList = JSON.parse(orderedListStr)