2017-08-21 31 views
1

我想轉儲一個包含嵌套列表的組件的字典,其中列表的每一行都在其自己的行上。我也想維護字典順序。轉儲嵌套列表的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) 
print('\n') 
YAML().dump(d, sys.stdout) 

這裏就是我真正得到:

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


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

第一種方法嵌套列表格式我想要的,但失去字典順序。 (沒有意外,因爲我沒有使用往返自卸車)第二種方法設法維持秩序,但失去了我想要的嵌套列表格式。任何時候我使用往返自卸車,我都失去了很好的嵌套列表格式。

這裏的任何提示?

回答

0

你的字典有你想要的順序是好運還是因爲你使用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()