【问题标题】:Load yaml list as dictionary将 yaml 列表加载为字典
【发布时间】:2017-11-15 18:18:24
【问题描述】:

我正在做一个简单的 yaml 加载并遇到了一个小问题:

代码:

with open(target, 'r') as stream:
    try:
        data = (yaml.load(stream))
    except Exception as exc:
        print (exc)

print(data)

第一个 yaml 文件:

test:
  - foo: 1
  - bar: 2
test2:
  - foo: 1
  - bar: 2

第二个yaml文件:

foo: 1
bar: 2

我只需要测试组中的值,因此当我尝试从第一个 yaml 访问数据时,我使用 print(data['test']) 返回这些值:

[{'foo': '1'}, {'bar': '2'}]

在第二个中,我使用print(data) 行,我得到:

{'foo': '1'}, {'bar': '2'}

我知道有几种方法可以解决这个问题,用空替换括号或使用迭代循环来创建一个新对象,但这看起来真的很复杂。有没有更好的方法可以让我得到我正在寻找的结果,而无需费力地创建更难阅读的代码?

【问题讨论】:

  • 我知道有几种方法可以解决这个问题这里有什么问题?
  • 数据被格式化为列表,我希望它作为字典而不使用循环来获取该格式。
  • @Merakel 好吧,如果您在 YAML 中有一系列映射,您将在 python 中获得一个字典列表。您必须自己处理数据。或者您可以尝试将!!omap 标签添加到第一个文件的列表中,然后您会得到一个ordereddict

标签: python-3.x yaml


【解决方案1】:

还有另一种方法。基于 yaml 文件语法。在您的 yaml 文件中使用此格式。

test:
  foo: 1
  bar: 2
test2:
  - foo: 1
  - bar: 2

有了这个,你可以调用你的 foo 测试字典。

>>>print(data[test][foo])
1

这是因为 yaml 将“-”读取为列表元素,而没有“-”的元素读取为字典元素。

【讨论】:

    【解决方案2】:

    您将获得正在阅读的 yaml 数据的字典。

    {'test': [{'foo': 1}, {'bar': 2}], 'test2': [{'foo': 1}, {'bar': 2}]}
    

    如果您想将test 组的值作为字典获取,您需要手动将字典列表创建到字典中。

    dicta = {k:v for d in data['test'] for k, v in d.items()}
    print(dicta) # {'foo': 1, 'bar': 2}
    

    【讨论】:

    • @Merakel 你有这方面的 cmet,请告诉我。
    猜你喜欢
    • 2021-07-17
    • 2015-12-14
    • 2020-07-10
    • 1970-01-01
    • 2019-03-05
    • 1970-01-01
    • 2010-12-19
    • 2017-04-23
    • 2021-10-13
    相关资源
    最近更新 更多