【问题标题】:Concatenating nested dictionary keys depending on number of values根据值的数量连接嵌套的字典键
【发布时间】:2019-05-16 00:56:15
【问题描述】:

我正在尝试操作嵌套字典以将任何嵌套字典的键向后组合,只有一个键。

我尝试以递归方式执行此操作,但我很难从字典中删除键并将它们替换为连接的键。

例如:

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

【问题讨论】:

  • 我不完全理解您对问题的解释,但我觉得您应该先查看zip()
  • _end_ 键是否得到特殊处理?似乎最终对象都有一个键,如果您向后工作,应该与它们的父对象结合?
  • end 键只是表示单词的结尾。它应该与任何其他键/值一样对待。
  • 请解释所需输出背后的基本原理。算法,一步一步来
  • 如果_end_ 的处理方式相同,为什么它没有连接到您想要的输出中的父级。它通过了作为单键字典的测试。

标签: python python-3.x dictionary


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-04
    • 1970-01-01
    • 2017-02-03
    • 2012-05-14
    • 2019-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多