【问题标题】:Dynamically generate array elements from yaml file in Python在 Python 中从 yaml 文件动态生成数组元素
【发布时间】:2018-08-14 01:06:58
【问题描述】:

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

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

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

因此,如果我遍历一个名为 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

的内容

任何想法或替代方案将不胜感激。

【问题讨论】:

  • 首先,tuple[[i['foo']['bar],i['hello']['world']] 应该是什么?你想要元组(i['foo'['bar'], i['hello']['world']),还是别的?
  • 但同时:当它们不是 JSON 字符串而是 YAML 数组时,我不知道为什么这些东西被称为 config1.jsonconfig2.json。但看起来您想要做的大部分事情是将每个子数组视为任意长度的i 的“关键路径”,而不是config1.json 中的固定长度2 和config2.json 中的1?如果是这样,那很容易……但我不确定您如何将[self._hi] 变成self._hi 而不是i['self._hi']。发生这种情况的规则是什么?

标签: python python-3.x yaml


【解决方案1】:

我认为您有点令人困惑,首先是因为您指的是 到“来自 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

【讨论】:

    猜你喜欢
    • 2021-05-20
    • 2021-07-31
    • 2015-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-21
    • 1970-01-01
    • 2021-11-23
    相关资源
    最近更新 更多