4

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

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

如何在所有后续级别中获得此 dict 的完整排序?

如果我使用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

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

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
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
于 2014-02-25T18:07:22.083 回答
1

如果你能负担得起额外的依赖,我会推荐blist package。它提供了许多分类容器,包括sorteddict. 然后你的字典就会一直保持排序。

检查sorteddict 类文档以了解确切用法。该软件包本身是生产质量和 BSD 许可证,因此在任何专有代码中使用都不是问题。

于 2014-02-25T17:55:12.087 回答