首页 > 解决方案 > 如何从嵌套字典中堆叠键并将其展平

问题描述

我有一个任务是扁平化嵌套的字典,这很容易。这是我的代码:

class Simple:

    def __init__(self):
        self.store_data = {}

    def extract_data(self, config):
        for key in config:
            if isinstance(config[key], dict):
                self.extract_data(config[key])
            else:
                self.store_data[{key}] = config[key]
        return self.store_data

这是我的输入:

input = {
    'k1_lv1': {
        'k1_lv2': 'v1_lv2', 'k2_lv2': 'v2_lv2'},
    'k2_lv1': 'v1_lv1',
    'k3_lv1': {
         'k1_lv2': 'v1_lv2', 'k2_lv2': 'v2_vl2'},
    'k4_lv1': 'v1_lv1',
}

这是我的输出(假设键是唯一的):

output = {
    'k1_lv2': 'v1_lv2', 'k2_lv2': 'v2_lv2', 
    'k2_lv1': 'v1_lv1',
    'k1_lv2': 'v1_lv2', 'k2_lv2': 'v2_vl2',
    'k4_lv1': 'v1_lv1'
}

但现在我的任务已经改变,我的输出必须变成这样:

output = {
    'k1_lv1_k1_lv2': 'v1_lv2',
    'k1_lv1_k2_lv2': 'v2_lv2',
    'k2_lv1': 'v1_lv1',
    'k3_lv1_k1_lv2': 'v1_lv2',
    'k3_lv1_k2_lv2': 'v2_vl2',
    'k4_lv1': 'v1_lv1'
}

所以我不仅要展平嵌套的字典,还要保存嵌套字典的键。我试图实现该输出,但我失败了。

标签: pythondictionary

解决方案


您可以对任务使用递归:

dct = {
    "k1_lv1": {"k1_lv2": "v1_lv2", "k2_lv2": "v2_lv2"},
    "k2_lv1": "v1_lv1",
    "k3_lv1": {"k1_lv2": "v1_lv2", "k2_lv2": "v2_vl2"},
    "k4_lv1": "v1_lv1",
}


def flatten(d, path=""):
    if isinstance(d, dict):
        for k, v in d.items():
            yield from flatten(v, (path + "_" + k).strip("_"))
    else:
        yield (path, d)


out = dict(flatten(dct))
print(out)

印刷:

{
    "k1_lv1_k1_lv2": "v1_lv2",
    "k1_lv1_k2_lv2": "v2_lv2",
    "k2_lv1": "v1_lv1",
    "k3_lv1_k1_lv2": "v1_lv2",
    "k3_lv1_k2_lv2": "v2_vl2",
    "k4_lv1": "v1_lv1",
}

推荐阅读