如何解决当嵌套字典只有一个元素时,减少嵌套字典的级别
当节点有 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 举报,一经查实,本站将立刻删除。