4

代替

key:
    - thisvalue
    - thatvalue
    - anothervalue

我想拥有

key:
    1. thisvalue
    2. thatvalue
    3. anothervalue

纯粹为了人类可读性,对{key: [thisvalue, thatvalue, anothervalue]}.

这似乎不是基本 YAML 语法的一部分,但有没有办法实现这一点 - 也许使用 YAML 中可能的一些高级奥术

(我意识到这可以通过将列表编写为来近似:

key:
    - 1. thisvalue
    - 2. thatvalue
    - 3. anothervalue

但这是一个丑陋的黑客,我更喜欢数字具有语义目的的解决方案,而不仅仅是值文本的一部分,这也需要被解析和删除。)

4

2 回答 2

3

在 YAML 中没有办法做到这一点。但是,您可以使用元素的正常嵌套,然后在解析期间根据这些生成数组/列表/字典:

my_numbered_pseudo_list:
  1: a
  2: b
  3: c
  ...
  n: x

当您从上面加载示例时,您将获得带有键“my_numbered_pseudo_list”的字典,其值作为包含所有嵌套对的字典{"1" : "a", "2" : "b", ..., "n" : "x"}。这是一个示例:

import yaml

doc = '''
list:
  1: a
  2: b
  3: c
  4: d
'''

y = yaml.load(doc);
list = []

for i in y['list']:
    list.append(y['list'].get(i))

print list

这会给你

['a', 'b', 'c', 'd']

如果您想确保订单实际保存在 YAML 文件中,您必须进行一些排序以获得有序的最终列表,其中保留了 YAML 文件中描述的顺序。

我还看到人们在结果字典(这里:“list”)上使用有序的哈希调用(例如在我不熟悉的 Ruby 中),所以你可能想多挖一点。

重要的!

在这里这里阅读。简而言之,为了确保您从 YAML 中获得一个真正有序的列表,您必须将您拥有的字典作为伪列表按键进行排序,然后提取值并将其附加到最终列表中。

于 2015-08-02T19:18:20.840 回答
2

使用 Python 时,为了能够保留 YAML 映射(以及注释、锚名称等)中的键顺序,如果您使用ruamel.yaml(声明:我是作者)和往返装载程序。

这些功能透明地用作 dicts,但是有了它,并使用 rbaleksandar 在她/他的回答中提出的语法,您可以这样做:

import ruamel.yaml as yaml

yaml_str = """\
key:
    1: thisvalue
    2: thatvalue
    3: anothervalue
    4: abc
    5: def
    6: ghi
"""

data = yaml.load(yaml_str, Loader=yaml.RoundTripLoader)
y = data['key']
print y.keys()[2:5]
print y.values()[2:5]
print y.items()[2:5]

要得到:

[3, 4, 5]
['anothervalue', 'abc', 'def']
[(3, 'anothervalue'), (4, 'abc'), (5, 'def')]

加载数据后无需任何特别的努力。

YAML 规范声明不保证密钥顺序,但在 YAML 文件中它们当然是有序的。如果解析器不丢掉这些信息,那么事情就更有用了,例如比较文件的修订版本。

于 2015-08-03T21:29:03.297 回答