如何在保留相同顺序的同时将OrderedDict
转换为普通字典?
我问这个的原因是因为当我从API获取数据时,我得到一个JSON字符串,我在其中使用json.loads(str)
来返回字典。从json.loads(...)
返回的这个词典只是乱序,随机排序。另外,我已经读过OrderedDict
使用起来很慢,所以我希望使用与原始JSON字符串相同顺序的常规字典。
稍微偏离主题:是否仍然使用json.loads(...)
将JSON字符串转换为字典,同时在不使用collections.OrderedDict
的情况下保持相同的顺序?
答案 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)