Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 转储嵌套列表的Ruamel yaml格式_Python_Python 3.x_Ruamel.yaml - Fatal编程技术网

Python 转储嵌套列表的Ruamel yaml格式

Python 转储嵌套列表的Ruamel yaml格式,python,python-3.x,ruamel.yaml,Python,Python 3.x,Ruamel.yaml,我想转储一个包含嵌套列表组件的字典,其中列表的每一行都在自己的行上。我还想维持字典的秩序 这里有一个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) prin

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

这里有一个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
第一个方法具有我想要的嵌套列表格式,但失去了字典顺序。(这并不奇怪,因为我没有使用往返转储程序)第二种方法设法维持顺序,但丢失了所需的嵌套列表格式。每当我使用往返转储程序时,我都会丢失良好的嵌套列表格式


这里有什么提示吗?

您的字典的顺序是您运气好,或者因为您使用的是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()

如果数据来自一个包含许多列表格式的文件,比如[[1,2],[3,4]?不确定你在问什么,所以最好发布一个真正的问题。当使用默认的往返解析器时,每个序列(和映射)都被加载到一个结构中,该结构知道它是流样式还是块样式。如果有大量的操作(即,在流样式中永远不能有块样式映射/序列),这些将被转储回原样,当然没有YAML的约束