作为 YAML 数组的编号列表

Numbered list as YAML array

而不是

key:
    - thisvalue
    - thatvalue
    - anothervalue

我想要

key:
    1. thisvalue
    2. thatvalue
    3. anothervalue

纯粹为了人类可读性,与{key: [thisvalue, thatvalue, anothervalue]}的解释相同。

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

(我意识到这可以通过将列表写成近似值:

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

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

在 YAML 中无法做到这一点。但是,您可以使用普通的元素嵌套,然后在解析过程中根据这些元素生成 array/list/dictionary:

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)所以你可能想挖掘一个多一点。

重要!

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

当使用 Python 时,为了能够保留 YAML 映射(以及注释、锚名称等)中的键顺序,如果您使用 [=12=,映射将被读入特殊的 ordereddict 派生词中](免责声明:我是作者)和 RoundTripLoader。

这些函数透明地用作字典,但是有了它,并使用 rbaleksandar 在 her/his 答案中提出的语法,您可以这样做:

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 文件中它们当然是有序的。如果解析器不随意丢弃这些信息,那么事情就会更有用,例如用于文件修订之间的比较。