Как сохранить порядок вложенного словаря в Python (не простой, но вложенный)? - PullRequest
0 голосов
/ 27 октября 2018

Я только что скопировал словарь, сгенерированный из другой программы, в программу на Python (жестко закодированную в коде Python).

a = {'b':{'d':3, 'c':4}, 'a':2}

но при чтении словаря порядок меняется, что создает проблему.

Если я также использую OrderedDict, то сохраняется только порядок верхнего уровня, но не внутренний словарь.

Мне нужен порядок, поскольку я генерирую дерево на основе данных словаря, чтобы при чтении из этого дерева я получал тот же порядок. Я использую версию Python 2.

Спасибо. Это недостаток Python?

Редактировать: Я использую этот однострочный оператор:

a = OrderedDict({'b':{'d':3, 'c':4}, 'a':2})

Я просто привел простой словарь в качестве примера, но мой настоящий словарь очень большой, поэтому я не могу вручную добавить OrderedDict во все внутренние словари, чтобы упорядочить его. Ищете решение в Python 2, если это невозможно, пожалуйста, укажите в Python 3

Ответы [ 2 ]

0 голосов
/ 28 октября 2018

Словари не заказываются в Python 2.x

Так что любое решение, которое считывает ваши данные как обычный словарь, будет для вас бесполезным. Сначала вам нужно сосредоточиться на этом аспекте вашего рабочего процесса, для которого вы не предоставили никакой информации или кода.

Использовать списки кортежей с OrderedDict

Это неверный способ инициализации OrderedDict:

a = OrderedDict({'b': {'d':3, 'c':4}, 'a':2})

Это терпит неудачу именно потому, что ваш словарь не упорядочен в Python 2.x. Кроме того, вы не пытались сделать внутренний словарь OrderedDict.

Вместо этого вам нужно подать списки кортежей , которые упорядочены, как во внешние OrderedDict , так и внутренние OrderedDict:

from collections import OrderedDict

a = OrderedDict([('b', OrderedDict([('b', 3), ('c', 4)])), ('a', 2)])
0 голосов
/ 27 октября 2018

Ваш внутренний словарь также должен быть OrderedDict.

В качестве альтернативы вы можете использовать ассоциативный список (список пар ключ-значение). Я думаю, что это ближе к тому, что вы пытаетесь сделать: уважать точный порядок или то, что вы читаете.

Другой альтернативой является ведение списка (для заказа) и указания доступа к элементам. Это должно быть сделано на каждом уровне.

...