而不是
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
但这是一个丑陋的黑客,我更喜欢一个解决方案,其中数字具有语义目的,而不仅仅是值的文本的一部分,也需要被解析和删除。)
答案 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中),所以你可能想要多挖一点。
重要!强>
阅读here和here。简而言之,为了确保从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文件中,它们当然是有序的。如果解析器不会丢失这些信息,那么事情会更有用,例如用于比较文件的修订版。