ドキュメントが言うように:
キーと値は任意の順序で繰り返されます。これはランダムではなく、Python の実装によって異なり、辞書の挿入と削除の履歴に依存します。
つまり、辞書には固有の順序がありません。そして、複雑な追加要素を一切使わずにそれを見ることができます:
>>> print {'c1': 0.5, 'gamma': 1, 'lambda': 1, 'A': 1}
{'A': 1, 'c1': 0.5, 'gamma': 1, 'lambda': 1}
挿入順にキーを保持する dict が必要な場合は、OrderedDict
.
ただし、この場合、それだけでは十分ではありません。(任意の順序を持つ) a を作成しdict
てから、それを an に渡すと、OrderedDict
最初の任意の順序が凍結されるだけです。
>>> from collections import OrderedDict
>>> print OrderedDict({'c1': 0.5, 'gamma': 1, 'lambda': 1, 'A': 1})
OrderedDict([('A', 1), ('c1', 0.5), ('gamma', 1), ('lambda', 1)])
そのrepr
の は、初期値の順序で をOrderedDict
作成する方法の手がかりを与えるはずです: 各要素がキーと値のペアであるシーケンスから作成します。OrderedDict
>>> print OrderedDict([('c1', 0.5), ('gamma', 1), ('lambda', 1), ('A', 1)])
OrderedDict([('c1', 0.5), ('gamma', 1), ('lambda', 1), ('A', 1)])
を自動有効化したい場合は、既存のクラスの代わりに をOrderedDict
使用して実行できます。ただし、使用しているクラスには考慮すべき問題がいくつかあります。特に、親クラスのメソッドで従来のスタイルの呼び出しではなく、実際に使用したい場合。それを行っていれば、定義するだけで完了できます。また、あなたのクラスがそのままでは適切にピクルスになるとは思いません。OrderedDict
dict
super
class AutoVivifiedOrderedDict(OrderedDict, AutoVivification): pass
自動有効化に を使用する場合defaultdict
、トリッキーな部分はすべて既に処理されています。
def AutoVivification():
return defaultdict(AutoVivification)
それに順序を追加する場合は、が必要になるOrderedDefaultDict
ため、次のようにできます。
def OrderedAutoVivification():
return OrderedDefaultDict(AutoVivification)
自分で作る方法がわからない場合はOrderedDefaultDict
、レシピを検索してください。(ほとんどの場合、両方のクラスから継承できます…シグネチャが異なるという事実を除いて、そのため、どの__init__
ように見えるべきかを考え、適切な引数で適切な基本初期化子を明示的に呼び出す必要があります。議論については、この質問を参照してください。 )