微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

当嵌套字典只有一个元素时,减少嵌套字典的级别

如何解决当嵌套字典只有一个元素时,减少嵌套字典的级别

当节点有 1 个元素时,我需要通过将内部键附加到上键来减少字典的嵌套级别。

示例:

鉴于这本词典:

{'A': {'a': {'1': {}}},'B': {'b': {'2': {}},'c': {'3': {'x': {}}},'d': {},'e': {'0': {},'1': {},},}

我需要返回:

{'A a 1': {},'B': {'b 2': {},'c 3 x': {},}

它应该适用于任意数量的级别,并且最后一个元素始终是一个空字典。

解决方法

您可以先展平结构以检索所有路径,然后使用 collections.defaultdict 重建它:

import collections
data = {'A': {'a': {'1': {}}},'B': {'b': {'2': {}},'c': {'3': {'x': {}}},'d': {},'e': {'0': {},'1': {}}}}
def flatten(d,c = []):
  for a,b in d.items():
     if not b:
        yield (c+[a],b)
     else:
        yield from flatten(b,c +[a])

def compress(d):
   _d,r = collections.defaultdict(list),{}
   for [a,*b],c in d:
     _d[a].append((b,c))
   for a,b in _d.items():
      val = compress(b) if len(b) > 1 and all(j for j,_ in b) else b[0][-1]
      r[a if len(b) > 1 else a+' '+' '.join(b[0][0])] = val
   return r

print(compress(list(flatten(data))))

输出:

{'A a 1': {},'B': {'b 2': {},'c 3 x': {},'d ': {},'e': {'0 ': {},'1 ': {}}
       }
 }
,

我相信这个递归函数适用于您的示例:

def flatten_keys(key_so_far = '',d={}):
    if len(d) > 1:
        sub_dict = {}
        for (k,v) in d.items():
            sub_dict.update(flatten_keys(k,v))
        return {key_so_far: sub_dict} if key_so_far else sub_dict
    elif d == {}:
        return {key_so_far: {}}
    else:
        k,v = list(d.items())[0]
        key_so_far += (' ' if key_so_far else '') + k
        return(flatten_keys(key_so_far,v))

input_d = {'A': {'a': {'1': {}}},'1': {},},}

flatten_keys(input_d)

# {'A a 1': {},'1': {}}}}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。