【问题标题】:how to stack the keys from nasted dict and to flatten it如何堆叠嵌套字典中的键并将其展平
【发布时间】:2026-02-04 14:45:01
【问题描述】:

我的任务是扁平化嵌套的 dict,这很容易。这是我的代码:

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

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

【问题讨论】:

    标签: python dictionary


    【解决方案1】:

    您可以对任务使用递归:

    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",
    }
    

    【讨论】:

      【解决方案2】:

      为什么不使用 input.keys() 遍历键,然后使用堆栈键

      output['{}_{}'.format(key_level1, key_level2]]= input['key_level1']['key_level2'] 
      

      您可能需要嵌套 for 循环并添加一个条件来测试字典中键的深度。

      【讨论】: