Преобразовать OrderedDict в обычный порядок сохранения dict?
Как мне конвертировать OrderedDict
в обычный словарь при сохранении того же порядка?
Я спрашиваю об этом потому, что когда я получаю свои данные из API, я получаю строку JSON, в которой я использую json.loads(str)
вернуть словарь. Этот словарь, который возвращается из json.loads(...)
просто вышел из строя и упорядочен случайным образом. Кроме того, я прочитал это OrderedDict
работает медленно, поэтому я хочу использовать обычный dict в том же порядке, что и исходная строка JSON.
Немного не по теме: есть ли в любом случае преобразовать строку JSON в dict, используя json.loads(...)
сохраняя тот же порядок без использования collections.OrderedDict
?
2 ответа
Когда вы конвертируете OrderedDict
к нормальному dict
Вы не можете гарантировать, что порядок будет сохранен, потому что диктовки неупорядочены. Вот почему OrderedDict
существует в первую очередь.
Кажется, ты пытаешься съесть свой торт и съесть его здесь. Если вы хотите сохранить порядок строки JSON, используйте ответ из вопроса, на который я ссылался в комментариях, чтобы загрузить строку JSON непосредственно в OrderedDict
, Но вы должны иметь дело с любым штрафом за производительность, который несет (я не знаю, что это за штраф. Это может быть даже незначительным для вашего варианта использования.). Если вы хотите максимально возможную производительность, просто используйте dict
, Но это будет неупорядоченным.
И JSON-объекты, и Python dicts неупорядочены. Чтобы сохранить порядок, используйте массивы JSON, которые отображаются в списки Python. Элементы массивов JSON должны быть объектами JSON. Они будут отображены в списки Python, диктовок 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)