отображение файла yaml в python - PullRequest
0 голосов
/ 01 июня 2018

Это файл YAML.Он содержит список сопоставлений от тикера до категории объектов.

Ниже приводится сопоставление BANKNIFTY_O_C_0_10_W:

index: [ BANKNIFTY_O_C_0_09_W: books,BANKNIFTY_O_C_0_09_W: trends,BANKNIFTY_O_C_0_09_W: trades,BANKNIFTY_O_C_0_09_W: relations,BANKNIFTY_O_P_0_09_W: books,BANKNIFTY_O_P_0_09_W: trends,BANKNIFTY_O_P_0_09_W: trades,BANKNIFTY_O_P_0_09_W: negrelations,BANKNIFTY_O_C_0_10_W: books,BANKNIFTY_O_C_0_10_W: trends,BANKNIFTY_O_C_0_10_W: trades,BANKNIFTY_O_C_0_10_W: relations,BANKNIFTY_O_C_0_10_W: options_banknifty_weekly,BANKNIFTY_O_P_0_10_W: books,BANKNIFTY_O_P_0_10_W: trends,BANKNIFTY_O_P_0_10_W: trades,BANKNIFTY_O_P_0_10_W: negrelations,BANKNIFTY_F_0: books,BANKNIFTY_F_0: trends,BANKNIFTY_F_0: trades,BANKNIFTY_F_0: relations,NIFTY_F_0: books,NIFTY_F_0: trends,NIFTY_F_0: trades,NIFTY_F_0: relations ]

Мне нужен следующий вывод:

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_09_W: [books, trends, trades, negrelations]
- BANKNIFTY_F_0: [books, trends, trades, relations]
- NIFTY_F_0: [books, trends, trades, relations]

1 Ответ

0 голосов
/ 02 июня 2018

Ваш ввод - это сопоставление одного элемента, а в качестве значения - список сопоставлений одного элемента.Ваш вывод представляет собой список сопоставлений отдельных элементов.Этот список упорядочен таким же образом, как и ключи оригинальных отображений.Это указывает на то, что сбор этой информации должен выполняться с использованием списка или 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-в-поток стиля)

...