编号列表为YAML数组

时间:2015-08-02 18:38:24

标签: syntax yaml grammar numbered-list

而不是

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

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

2 个答案:

答案 0 :(得分:2)

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

重要!

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

答案 1 :(得分:2)

使用Python时,为了能够保留YAML映射中的键顺序(以及注释,锚名称等),如果使用ruamel.yaml,映射将被读入特殊的有序数字衍生物(免责声明:我是作者)和RoundTripLoader。

那些透明地起作用,但是使用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文件中,它们当然是有序的。如果解析器不会丢失这些信息,那么事情会更有用,例如用于比较文件的修订版。