ここで少し違う答えがあります。読みやすさ以外の理由で要素の順序が重要である場合、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にdict、またはitems属性を持つものを指定すると、ダンプする前にアイテムが並べ替えられますが、items()の出力(たとえば、(keyのリスト)を指定すると、 、値)タプル)、そうではありません。したがって、私たちは使用することができます
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を使用することは実際にはまったく必要ありません。必要なのは、質問と回答のペアが、表現者を記述できるクラスのものである必要があることだけです。
繰り返しになりますが、これは人間の読みやすさと美的目的のためだけであることを理解してください。ここでの順序は、!! omapを使用している場合のように、YAMLの重要性はありません。これは読みやすさのためにあなたにとって主に重要であるように見えました。