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