在嵌套字典中连接键

时间:2014-10-01 15:22:24

标签: python recursion dictionary

给出一个嵌套字典:

nested = {
    'A': {
        'B': {
            'C': 'C val',
            'G': 'G val'
        },
        'D': {
            'E': {
                'F': 'F val'
            }
        }
    }
}

我希望以递归方式连接字典的键,除了“最终”键值对,并将连接键放在新字典中,如下所示:

expected = { 'A:B': {'C': 'C val', 'G': 'G val'}, 'A:D:E': {'F': 'F val'} }

如何在不事先知道嵌套字典的结构的情况下创建这样的函数?

1 个答案:

答案 0 :(得分:1)

递归解决方案是最简单的。这段代码就像你问的那样。

def flatten(dictionary, prefix=[], result={}):

    for k, v in dictionary.iteritems():
        type_v = type(v)
        if type_v == dict:
            flatten(v, prefix+[k], result)
        elif type_v == str:
            prefix_str = ':'.join(prefix)
            if not prefix_str in result:
                result[prefix_str] = {}
            result[prefix_str][k] = v
        else:
            raise TypeError('%s not permissible in data structure' % type_v)

    return result


nested = {
    'A': {
        'B': {
            'C': 'C val',
            'G': 'G val',
        },
        'D': {
            'E': {
                'F': 'F val',
            }
        }
    }
}

expected = flatten(nested)
print(expected)

<强>输出

{'A:B': {'C': 'C val', 'G': 'G val'}, 'A:D:E': {'F': 'F val'}}