キー/値を宣言どおりの順序で保持するにはどうすればよいでしょうか? 質問する

キー/値を宣言どおりの順序で保持するにはどうすればよいでしょうか? 質問する

特定の順序で宣言した辞書があり、常にその順序を維持したいと考えています。キー/値は、値に基づいて順序を維持することは実際にはできないため、宣言した順序で維持したいだけです。

辞書があれば:

d = {'ac': 33, 'gw': 20, 'ap': 102, 'za': 321, 'bs': 10}

表示したり反復処理したりすると、その順序にはなりません。キー/値を宣言した明示的な順序を Python が維持するようにする方法はありますか?

ベストアンサー1

Python 3.6 以降では、標準dict型はデフォルトで挿入順序を維持します。

定義

d = {'ac':33, 'gw':20, 'ap':102, 'za':321, 'bs':10}

ソース コードにリストされている順序でキーが含まれる辞書が生成されます。

これは、スパースハッシュテーブルに整数の単純な配列を使用することで実現しました。この整数は、キーと値のペア(および計算されたハッシュ)を格納する別の配列のインデックスです。後者の配列は、たまたま挿入順にアイテムを格納するため、この組み合わせ全体では、Python 3.5以前で使用されていた実装よりもメモリ使用量が少なくなります。オリジナルのアイデア投稿者: Raymond Hettinger詳細については。

3.6では、これはまだ実装の詳細と考えられていました。Python 3.6ドキュメントの新機能:

この新しい実装の順序保持の側面は実装の詳細と見なされ、依存すべきではありません (これは将来変更される可能性がありますが、言語仕様を変更して、現在および将来のすべての Python 実装に対して順序保持セマンティクスを義務付ける前に、この新しい dict 実装を言語にいくつかのリリースで組み込むことが望まれます。これは、ランダム反復順序がまだ有効になっている言語の古いバージョン (Python 3.5 など) との下位互換性を維持するのにも役立ちます)。

Python 3.7ではこの実装の詳細が言語仕様に昇格したため、dictそのバージョン以降と互換性のあるすべてのPython実装で順序を維持することが必須になりました。BDFLによる宣言Python 3.8以降では、辞書もサポートされています。逆の反復

それでも、collections.OrderedDict()クラス場合によっては、標準dictタイプに加えていくつかの追加機能を提供するため、可逆(これはオブジェクトを表示する)、および並べ替えのサポート(move_to_end()方法)。

おすすめ記事