根据值的数量串联嵌套的字典键

时间:2019-05-16 00:56:15

标签: python python-3.x dictionary

我正在尝试操纵嵌套字典,以仅用单个键向后组合任何嵌套字典的键。

我尝试递归地执行此操作,但是我很难从字典中删除键并将其替换为串联键。

例如:

{'adv':
    {'e':
        {'r':
            {
                's':
                    {'e':
                         {'_end_': '_end_'}
                     },
                't':
                    {'_end_': '_end_',
                     'i':
                         {'s':
                              {'e':
                                   {'r':
                                        {'_end_': '_end_'}
                                    }
                               }
                          }
                     }
            }
        },
        'i': {'c': {'e': {'_end_': '_end_'}
                    }
              }
    }
}

将成为

{'adv':
    {'er':
        {
            'se':
                {'_end_': '_end_'},
        't':
            {'_end_': '_end_',
             'iser':
                 {'_end_': '_end_'}

             }
        },
        'ice':
                 {'_end_': '_end_'}
    }
}

1 个答案:

答案 0 :(得分:0)

这是一个有趣的问题-可能有一个更优雅的解决方案,但我做了以下事情:

import pprint

t={'adv': {'e': {'r': {'s': {'e': {'_end_': '_end_'}},
                       't': {'_end_': '_end_',
                             'i': {'s': {'e': {'r': {'_end_': '_end_'}}}}}}},
           'i': {'c': {'e': {'_end_': '_end_'}}}}}


def concat_dict(d):
    if d == '_end_':
        return '_end_'

    rv = {}

    for k, v in d.items():
        if '_end_' in v:
            rv[k] = concat_dict(v)
        elif len(list(x for x in v.keys() if x != '_end_')) == 1:
            top_str = k
            next_str = list(v.keys())[0]
            rv[top_str + next_str] = concat_dict(v[next_str])
        else:
            rv[k] = concat_dict(v)
    return rv

def format_dict(d):
    while concat_dict(d) != d:
        d = concat_dict(d)
    return d


pprint.pprint(format_dict(t))

输出:

{'adv': {'er': {'se': {'_end_': '_end_'},
                't': {'_end_': '_end_', 'iser': {'_end_': '_end_'}}},
         'ice': {'_end_': '_end_'}}}