如何展平嵌套字典的某些级别?

2024-10-03 02:41:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经嵌套了字典d,如下所示

d = {'id': {"a,b": {'id': {"x": {'id': None},
                           "y": {'id': {"a": {'id': None},
                                        "b": {'id': None}}}}},
            "c,d": {'id': {"c": {'id': None},
                            "d": {'id': {"x": {'id': None},
                                         "y": {'id': None}}}}}}}

并希望取消某些级别的测试并将其压缩为以下输出:

{"a,b": {"x": None,
         "y": {"a": None,
               "b": None}},
 "c,d": {"c": None,
         "d": {"x": None,
               "y": None}}}

要取消对键为id的任何嵌套字典的测试,并将其替换为内部字典

我的出发点是:

def unnest_dictionary(d):
    for k,v in d.items():
        if isinstance(v, dict):
            unnest_dictionary(v)
        if k=='id':
            ......

我不知道如何从那里发现它


Tags: innoneidfordictionaryif字典def
1条回答
网友
1楼 · 发布于 2024-10-03 02:41:26

下面是我如何解决它的

我压平了字典,用id删除了级别,然后再次嵌套它

import re

d = {'id': {"a,b": {'id': {"x": {'id': None},
                           "y": {'id': {"a": {'id': None},
                                        "b": {'id': None}}}}},
            "c,d": {'id': {"c": {'id': None},
                            "d": {'id': {"x": {'id': None},
                                         "y": {'id': None}}}}}}}


def flatten_dict(dd, separator ='_', prefix =''): 
    return { prefix + separator + k if prefix else k : v 
             for kk, vv in dd.items() 
             for k, v in flatten_dict(vv, separator, kk).items() 
             } if isinstance(dd, dict) else { prefix : dd }

def nest_dict(dict1): 
    result = {} 
    for k, v in dict1.items(): 

        split_rec(k, v, result) 
    return result 

def split_rec(k, v, out): 

    k, *rest = k.split('_', 1) 
    if rest: 
        split_rec(rest[0], v, out.setdefault(k, {})) 
    else: 
        out[k] = v  

flat_d = flatten_dict(d)
for k in list(flat_d.keys()):
    new_key = re.sub(r'_id|id_','',k)
    flat_d[new_key] = flat_d.pop(k)
nested_d = nest_dict(flat_d)

print(nested_d)
# {'a,b': {'x': None, 'y': {'a': None, 'b': None}}, 'c,d': {'c': None, 'd': {'x': None, 'y': None}}}

相关问题 更多 >