Python完成了嵌套字典的排序

时间:2014-02-25 17:42:42

标签: python nested trie ordereddictionary

我有一些由OrderedDicts组成的trie(但顺序错误),如下所示:

    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':{}}}
    }

3 个答案:

答案 0 :(得分:3)

使用递归,请记住有两种情况:分支和叶子。一定要考虑到这两点。

def make_ordered(d):
    if isinstance(d, dict):
        return OrderedDict(sorted((key, make_ordered(value)) for key, value in d.iteritems()))
    else:
        return d

答案 1 :(得分:1)

如果你能承受额外的依赖,我会推荐blist package。它提供了许多已排序的容器,包括sorteddict。然后你的字典就会一直保持排序。

检查sorteddict class docs的确切用法。软件包本身就是生产质量和BSD许可证,因此在任何专有代码中都不会出现问题。

答案 2 :(得分:1)

from collections import OrderedDict as OD
def order(X):
    retval = OD()

    # The standard iterator of a dict is its keys.
    for k in sorted(X):
        # Incase it something we can't handle.
        if isinstance(X[k], dict):
            # I want my children dicts in order.
            retval[k] = order(X[k])
        else:
            retval[k] = X[k]

    return retval