3

我想转储一个包含嵌套列表组件的字典,其中列表的每一行都在自己的行上。我也想维护字典顺序。

这是一个MWE:

import sys

from ruamel import yaml
from ruamel.yaml import YAML

d = {'b':1,
     'a':[[1, 2],[3, 4]]}

# desired output:
# b: 1
# a:
# - [1, 2]
# - [3, 4]

print()
yaml.dump(d, sys.stdout)
print('\n')
YAML().dump(d, sys.stdout)

这就是我实际得到的:

a:
- [1, 2]
- [3, 4]
b: 1


b: 1
a:
- - 1
  - 2
- - 3
  - 4

第一种方法具有我想要的嵌套列表格式,但丢失了字典顺序。(这并不奇怪,因为我没有使用往返转储器)第二种方法设法维持秩序,但失去了我想要的嵌套列表格式。每当我使用往返转储器时,我都会丢失漂亮的嵌套列表格式。

这里有什么提示吗?

4

1 回答 1

1

你的字典有你想要的顺序要么是运气,要么是因为你使用的是 Python 3.6。在较旧版本的 Python(即 < 3.6)中,不保证此顺序。

如果您只针对 3.6 并且有ruamel.yaml>=0.15.32您可以执行以下操作:

import sys

from ruamel import yaml
from ruamel.yaml import YAML


d = {'b':1,
     'a':[[1, 2],[3, 4]]}

y = YAML()
y.default_flow_style = None
y.dump(d, sys.stdout)

如果您有旧版本和 Python 3.6:

import sys

from ruamel import yaml
from ruamel.yaml import YAML

y = YAML()

d = {'b':1,
     'a':[y.seq([1, 2]),y.seq([3, 4])]}


for seq in d['a']:
    seq.fa.set_flow_style()
y.dump(d, sys.stdout)

要得到:

b: 1
a:
- [1, 2]
- [3, 4]

要在旧版本的 Python 中始终如一地获得您想要的顺序,您应该这样做:

d = y.map()
d['b'] = 1
d['a'] = y.seq([1, 2]),y.seq([3, 4])

ruamel.yaml>=0.15.32你一起可以省去对y.seq().

于 2017-08-21T08:59:00.157 回答