如何将OrderedDict转换为保持顺序的普通dict?

1 投票
2 回答
4095 浏览
提问于 2025-04-18 08:07

我该如何将一个 OrderedDict 转换成普通字典,同时保持原来的顺序呢?

我之所以问这个问题,是因为当我从一个API获取数据时,得到的是一个JSON字符串。我用 json.loads(str) 来把它转换成字典。但是,这个从 json.loads(...) 返回的字典顺序是乱的,完全没有规律。而且,我听说 OrderedDict 处理起来比较慢,所以我想用普通字典,并且保持和原始JSON字符串相同的顺序。

稍微偏题一下:有没有办法在不使用 collections.OrderedDict 的情况下,使用 json.loads(...) 将JSON字符串转换成字典,同时保持原来的顺序呢?

2 个回答

1

JSON对象和Python字典都是没有顺序的。如果你想保留顺序,可以使用JSON数组,它们对应于Python中的列表。JSON数组里的元素应该是JSON对象。这些对象会被转换成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)
6

更新: 从Python 3.6开始,内置的 dict 行为就像 OrderedDict 一样。 也就是说,它们会保持插入的顺序。


当你把一个 OrderedDict 转换成普通的 dict 时,不能保证顺序会被保留,因为普通的字典是无序的。这就是为什么会有 OrderedDict 这个东西。

看起来你想要两全其美。如果你想保持JSON字符串的顺序,可以参考我在评论中提到的答案,直接把你的JSON字符串加载到一个 OrderedDict 中。但这样做可能会影响性能(我不太清楚具体会影响多少,可能对你的使用场景影响不大)。如果你想要最佳的性能,就用 dict 吧。但要记住,它是无序的。

撰写回答