4

次のような OrderedDicts で構成されたある種のトライがあります(ただし、順序が間違っています)。

    test = {
        'ab':{
            '1':{},
            '2':{
                '002':{},
                '001':{}}},
        'aa':{
            '02':{
                'ac':{},
                '01':{}, 
                'ca':{}, 
                'ab':{}},
            '01':{
                'b':{}, 
                'z':{
                    '0':{}, 
                    '1':{}}}}
    }

後続のすべてのレベルでこの辞書の完全な順序を取得するにはどうすればよいですか?

collections.OrderedDict(sorted(test.iteritems()))を使用すると、最初のレベルでのみソートされます。

どういうわけか最も深いレベルまで再帰的に呼び出す関数を作成する必要があると感じていますが、問題を解決するためにさまざまな方法を試すのに何時間も費やした後も、まだここで立ち往生しています。

最終的には次のようになります。

    test = {
        'aa':{
            '01':{
                'b':{}, 
                'z':{
                    '0':{}, 
                    '1':{}}},
            '02':{
                '01':{},
                'ab':{},
                'ac':{},
                'ca':{}}},

        'ab':{
            '1':{},
            '2':{
                '001':{},
                '002':{}}}
    }
4

3 に答える 3

3

再帰には、ブランチとリーフの 2 つのケースがあることに注意してください。必ず両方を考慮してください。

def make_ordered(d):
    if isinstance(d, dict):
        return OrderedDict(sorted((key, make_ordered(value)) for key, value in d.iteritems()))
    else:
        return d
于 2014-02-25T17:54:21.150 に答える
1

追加の依存関係を利用できる場合は、blist packageをお勧めします。を含む多くのソートされたコンテナーを提供しますsorteddict。そうすれば、辞書は常にソートされたままになります。

正確な使用方法については、 sorteddict クラスのドキュメントを確認してください。パッケージ自体は製品品質であり、BSD ライセンスであるため、独自のコードで使用しても問題ありません。

于 2014-02-25T17:55:12.087 に答える