在python中映射yaml文件

2024-09-26 17:39:00 发布

您现在位置:Python中文网/ 问答频道 /正文

这是一个YAML文件。它包含从ticker到feature category的映射列表。在

以下是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 ]

我需要以下输出:

^{pr2}$

Tags: 文件yaml列表indextradesbooksfeatureoptions
1条回答
网友
1楼 · 发布于 2024-09-26 17:39:00

您的输入是一个单项映射,值是一个单项映射的列表。 输出是单个项映射的列表。那张单子是 以相同的方式排列原始映射的键。这表示应该使用列表或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)

它给出了:

^{pr2}$

yaml.default_flow_style=None是必需的,因为默认情况下,YAML()实例将使用块样式,而您的输出在叶节点上具有流样式。在ruamel.yaml中,可以通过不生成“正常”的dict和列表,而是对内部用于保存往返信息的对象进行子类化,从而实现更精细的控制。在您的例子中,这是不必要的,因为您想要由.default_flow_styleFalse:所有块样式,True:所有流样式,None:流样式中有叶的块样式)控制的三种模式之一

相关问题 更多 >

    热门问题