Ваш ввод - это сопоставление одного элемента, а в качестве значения - список сопоставлений одного элемента.Ваш вывод представляет собой список сопоставлений отдельных элементов.Этот список упорядочен таким же образом, как и ключи оригинальных отображений.Это указывает на то, что сбор этой информации должен выполняться с использованием списка или OrderedDict
. Соответствующие значения этих отображений представляют собой список исходных значений для ключей этих отображений, также в порядке их появления, но которыехотя бы частично повторить в оригинале, а не в цели.Поскольку ордер нуждается в сохранении, set
(который автоматически отфильтровывает дубликаты) использовать нельзя.Вместо этого можно использовать список, который требует проверки элемента, уже находящегося в списке.Однако в дальнейшем я использую другой OrderedDict
, который используется как "OrderedSet
", поскольку не смотрит на значения.
Предполагается, что входные данные находятся в файле input.yaml
:
import sys
import pathlib
from collections import OrderedDict
import ruamel.yaml
yaml_file = pathlib.Path('input.yaml')
yaml = ruamel.yaml.YAML()
yaml.default_flow_style = None
data = yaml.load(yaml_file)
indexed = OrderedDict()
for elem in data['index']:
for k in elem: # just one each
single_item_map = indexed.setdefault(k, OrderedDict())
single_item_map[elem[k]] = None # arbitrary value, unused
l = []
for elem in indexed:
l.append({elem: [k for k in indexed[elem]]})
data['index'] = l
yaml.dump(data, sys.stdout)
, который дает:
index:
- BANKNIFTY_O_C_0_09_W: [books, trends, trades, relations]
- BANKNIFTY_O_P_0_09_W: [books, trends, trades, negrelations]
- BANKNIFTY_O_C_0_10_W: [books, trends, trades, relations, options_banknifty_weekly]
- BANKNIFTY_O_P_0_10_W: [books, trends, trades, negrelations]
- BANKNIFTY_F_0: [books, trends, trades, relations]
- NIFTY_F_0: [books, trends, trades, relations]
yaml.default_flow_style=None
необходим, поскольку по умолчанию экземпляр YAML()
будет использовать стиль блока, тогда как ваш вывод имеет стиль потока на листовых узлах.Более точное управление возможно в ruamel.yaml
, если не создавать «нормальные» диктовки и списки, а создавать подклассы для объектов, используемых внутри для хранения информации о передаче.В вашем случае в этом нет необходимости, поскольку вы хотите, чтобы один из трех режимов контролировался .default_flow_style
(False
: стиль всех блоков, True
: стиль всех потоков, None
: стиль блоков с-leafs-в-поток стиля)