YAML: порядок вывода из словаря - PullRequest
0 голосов
/ 06 октября 2018

Я хотел бы записать следующий вывод в файл YAML:

'0':[]
'1':[]
'2':[]
'3':[]
...
'100':[]

Я могу сделать это:

import yaml
d = {str(i):[] for i in range(101)}
with open('result.yml', 'w') as yaml_file:
    yaml.dump(d, yaml_file, default_flow_style=False)

Но порядок не будет сохранен.Как я могу получить желаемый результат?

Спасибо!

1 Ответ

0 голосов
/ 07 октября 2018

YAML определяет, что порядок сопоставления ключей не должен передавать информацию о содержимом.Следовательно, вы не должны зависеть от порядка отображения ключей при использовании YAML.Смотрите также это обсуждение .Если то, что вы делаете, зависит от порядка ключей, вы должны использовать список, например:

import yaml

d = [{str(i): []} for i in range(101)]
with open('result.yml', 'w') as yaml_file:
    yaml.dump(d, yaml_file, default_flow_style=False)

, который дает вам:

- '0': []
- '1': []
- '2': []

с сохранением порядка ключей, потому чтоВы завернули пары ключ-значение в список.

Если вам действительно нужно записать отображение в том порядке, в котором вы хотите, чтобы оно было, вы все равно можете использовать API событий низкого уровня:

import yaml
from yaml.events import *

d = [StreamStartEvent(), DocumentStartEvent(),
     MappingStartEvent(anchor=None, tag=u'tag:yaml.org,2002:map', implicit=True)]
for i in range(101):
  d.extend([ScalarEvent(anchor=None, tag=u'tag:yaml.org,2002:str', value=str(i),
                       implicit=(True, True)),
            SequenceStartEvent(anchor=None, tag=u'tag:yaml.org,2002:seq', implicit=True),
            SequenceEndEvent()])
d.extend([MappingEndEvent(), DocumentEndEvent(), StreamEndEvent()])

with open('result.yml', 'w') as yaml_file:
  yaml.emit(d, yaml_file)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...