给出以下存储在 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
的内容任何想法或替代方案都将不胜感激。
答案 0 :(得分:0)
我认为您有点困惑,首先是因为您指的是
到“来自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
。