У меня здесь несколько другой ответ. Ответ dbaupp верен, если порядок элементов важен для вас по причинам, отличным от читабельности. Если единственная причина, по которой вы хотите, чтобы вопрос отображался перед ответом, - это сделать файл более читабельным для человека, тогда вам не нужно использовать !! omap, и вместо этого вы можете использовать собственные представления, чтобы получить нужный вам порядок.
Прежде всего, ваша проблема с дампером, создающим дамп без - впереди, состоит в том, что вы выкидываете только одно сопоставление, а не их список. Поместите свой диктант в список, и это будет исправлено. Итак, начнем с:
d = [{"question": "What is the name of this sequence of numbers: 1, 1, 2, 3, 5, 8, 13, ...",
"answer": ["The Fibonacci Sequence", "The Padovan Sequence", "The Morris Sequence"]}]
Теперь у нас есть определенный порядок, в котором мы хотим получить вывод, поэтому мы его укажем и преобразуем в OrderedDict с таким порядком:
from collections import OrderedDict
order = ['question', 'answer']
do = [ OrderedDict( sorted( z.items(), key=lambda x: order.index(x[0]) ) ) for z in d ]
Далее нам нужно сделать так, чтобы PyYAML знал, что делать с OrderedDict. В этом случае мы не хотим, чтобы это был !! omap, мы просто хотим отобразить с определенным порядком. По какой-то мотивации, неясной для меня, если вы даете dumper.represent_mapping диктовку или что-либо с атрибутом items, он будет сортировать элементы перед сбросом, но если вы дадите ему выходные данные items () (например, список (ключ , значение) кортежи), это не будет. Таким образом, мы можем использовать
def order_rep(dumper, data):
return dumper.represent_mapping( u'tag:yaml.org,2002:map', data.items(), flow_style=False )
yaml.add_representer( OrderedDict, order_rep )
А затем наш вывод из print yaml.dump(do)
заканчивается как:
- question: 'What is the name of this sequence of numbers: 1, 1, 2, 3, 5, 8, 13, ...'
answer: [The Fibonacci Sequence, The Padovan Sequence, The Morris Sequence]
Есть несколько разных способов сделать это. Использование OrderedDict на самом деле вообще не нужно, вам просто нужно, чтобы пары вопросов / ответов были некоторого класса, для которого вы можете написать представитель.
И снова осознайте, что это только для читабельности и эстетических целей человека. Порядок здесь не будет иметь никакого значения YAML, как если бы вы использовали !! omap. Казалось, что это было в первую очередь важно для читабельности.