如何将python嵌套dict转换为非嵌套dict?

时间:2019-04-11 03:29:51

标签: python dictionary

如何在src dict(嵌套dict)下方转换

{
    'a':{'b':1, 'c':{'d':2}},
    'b':3,
    'c':{'d':4, 'a':5}
}

到下面的dst dict(未嵌套)?

{
    'a.b':1,
    'a.c.d':2,
    'b':3,
    'c.d':4,
    'c.a':5
}

src字典是嵌套字典。并且dst dict不是嵌套dict。

有什么简单的方法可以做到这一点?

3 个答案:

答案 0 :(得分:5)

这是扁平化字典的python包。你可以用这个

https://pypi.org/project/flatten-dict/

实施:

from flatten_dict import flatten

nested = {'a': {'b': 1, 'c': {'d': 2}},
          'b': 3,
          'c': {'d': 4, 'a': 5}}

flat = flatten(nested, reducer=lambda k1, k2: k2 if k1 is None else k1 + '.' + k2)
print(flat)
# {'a.b': 1, 'a.c.d': 2, 'b': 3, 'c.d': 4, 'c.a': 5}

答案 1 :(得分:2)

有多种方法。这是一种方法。

    nested_dict = {
        'a': {
            'b': 1,
            'c': {
                'd': 2
            }
        },
        'b': 3,
        'c': {
            'd': 4,
            'a': 5
        },
    }

    flatten_dict = {}

    def flatten_the_nested(nested_dict, parent_key=''):
        for key, value in nested_dict.items():
            new_key = parent_key + '.' + key if parent_key is not '' else key
            if isinstance(value, dict):
                flatten_the_nested(value, new_key)
            else:
                flatten_dict[new_key] = value

        return flatten_dict


     print(flatten_the_nested(nested_dict, ''))

您将得到以下结果。

    {'c.d': 4, 'c.a': 5, 'b': 3, 'a.b': 1, 'a.c.d': 2}

或者,如果您想使用某些库,则可以使用https://pypi.org/project/flatten-dict/

答案 2 :(得分:0)

嗯,它并不复杂。在短短的几分钟内,我得到了以下信息:

def flatten(dic, prefix = ""):
    if prefix is not "":
        prefix = prefix + "."

    result = {}

    for k, v in dic.iteritems():
        if isinstance(v, dict):
            for k1, v1 in flatten(v, prefix + k).iteritems():
                result[k1] = v1
        else:
            result[prefix + k] = v

    return result

不过,我尚未彻底测试该算法。