繁体   English   中英

在Python中从yaml文件动态生成数组元素

[英]Dynamically generate array elements from yaml file in Python

给定存储在my_yaml中的以下yaml文件,其中包含各种字典键和/或类变量集(由self ._ *表示):

config1.json:
- [[foo, bar], [hello, world]]
config2.json:
- [[foo], [self._hi]]

从json文件,我想填充一个新的元组列表。 每个元组中的项目都是通过在此yaml文件中查找字典键来确定的。

因此,如果我遍历一个名为config1.json的字典,并且有一个名为config_list的空列表,我想执行以下操作:

config_list.append(tuple[i['foo']['bar],i['hello']['world']])

但是,如果它是config2.json ,我想做类似的事情:

config_list.append(tuple[i['foo'],self._hi])

我可以用一种不太动态的方式做到这一点:

for i in my_yaml['config1.json'][0]:
    config_list.append(tuple([ i[my_yaml[asset][0][0]][my_yaml[asset][0][1]],i[my_yaml[asset][1][0]][my_yaml[asset][1][1]]]))

要么:

for i in my_yaml['config2.json'][0]:
    config_list.append(tuple([ i[my_yaml[asset][0][0]],i[my_yaml[asset][1][0]]]))

相反,我想动态生成config_list的内容

任何想法或选择将不胜感激。

我认为您有点困惑,首先是因为您是指“来自json [ sic ]文件”中的文件,而且问题中的任何地方都没有提到JSON文件。 有些映射键看起来像JSON文件的文件名,所以我希望我们可以假设您的意思是“来自与以字符串.json结尾的映射键关联的值”。

另一个令人困惑的事情是,您混淆了想要元组但从YAML文档加载嵌套在列表中的列表的事实。 如果需要元组,则在YAML文档中指定元组会更加清楚:

config1.json:
- !!python/tuple [[foo, bar], [hello, world]]
config2.json:
- !!python/tuple [[foo], [self._hi]]

因此,您可以执行以下操作:

import sys
import ruamel.yaml


yaml = ruamel.yaml.YAML(typ='unsafe')
with open('my.yaml') as fp:
    my_yaml = yaml.load(fp)

for key in my_yaml:
    for idx, elem in enumerate(my_yaml[key]):
        print('{}[{}] -> {}'.format(key, idx, my_yaml[key][idx]))

它直接为您提供您似乎想要的元组,而不是您需要处理的列表:

config1.json[0] -> (['foo', 'bar'], ['hello', 'world'])
config2.json[0] -> (['foo'], ['self._hi'])

在您的问题中,您硬编码访问序列的第一个也是唯一的元素,它们是根级别映射的值。 这迫使您在for循环中使用最后的[0] 我假设您将在这些序列中包含多个元素,但是对于一个好问题,您应该将其排除在外,因为这与如何获取元组并因此仅使事物混淆的问题无关。

请注意,您需要保持对输入的控制,因为您猜到使用typ='unsafe'是不安全的。 如果您不能保证使用typ='safe'并注册并使用标签!tuple

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM