【发布时间】:2020-04-24 18:09:08
【问题描述】:
我有一本像这样的字典:
d = {
'simulation__config__name': '0',
'simulation__config__ver': '1',
'simulation__config__rev': '2',
'simulation__model__name': '3',
'simulation__name': '4',
'site__name': '5',
'site__placement': '6',
'name': '7'}
我想按'__' 拆分键并将它们分组,然后按'__' 拆分这些键并将它们分组等,直到无法再分组。
最后,我会得到这样的结果:
out = {
'simulation': {'simulation__config': {'simulation__config_name': 0,
'simulation__config_ver': 1,
'simulation__config_rev': 2},
'simulation__model': {'simulation__model_name': 3},
'simulation__name': 4},
'site': {'site__name': 5, 'site__placement': 6},
'name': 7}
我真的很难将递归函数组合在一起。我想我或多或少已经弄清楚了,从某种意义上说,如果我手动单步执行它,它就可以工作......但我无法弄清楚如何在没有手动干预的情况下让它正确调用。
这是我当前的代码:
from itertools import groupby
d = {
'simulation__config__name': '0',
'simulation__config__ver': '1',
'simulation__config__rev': '2',
'simulation__model__name': '3',
'simulation__name': '4',
'site__name': '5',
'site__placement': '6',
'name': '7'}
def get_key(string, i):
return '__'.join(string.split('__')[0:i+1])
def recursive_group(iterable, i):
if not isinstance(iterable, dict):
return
out = {}
for k,g in groupby(iterable.keys(), lambda x: get_key(x,i)):
inner = {key:iterable[key] for key in g}
if k in iterable.keys():
out.update(inner)
else:
out.update({k:inner})
return out
out = recursive_group(d, 0)
#{'simulation': {'simulation__config__name': '0', 'simulation__config__ver': '1', 'simulation__config__rev': '2', 'simulation__model__name': '3', 'simulation__name': '4'}, 'site': {'site__name': '5', 'site__placement': '6'}, 'name': '7'}
out1 = recursive_group(out['simulation'], 1)
#{'simulation__config': {'simulation__config__name': '0', 'simulation__config__ver': '1', 'simulation__config__rev': '2'}, 'simulation__model': {'simulation__model__name': '3'}, 'simulation__name': '4'}
out2 = recursive_group(out1['simulation__config'], 2)
#{'simulation__config__name': '0', 'simulation__config__ver': '1', 'simulation__config__rev': '2'}
out3 = recursive_group(out2['simulation__config__name'], 3)
#None
out4 = recursive_group(out['site'], 1)
#{'site__name': '5', 'site__placement': '6'}
out5 = recursive_group(out4['site__name'], 2)
#None
out6 = recursive_group(out['name'], 1)
#None
在每个级别的分组中,我似乎都得到了想要的结果。当它到达不再发生分组的最终级别时,它返回一个无。我觉得我只是错过了最后几个步骤来将它们拼凑在一起。
请帮助编码专家!!
【问题讨论】:
-
您确定不想要
'simulation': {'config': {'name': ..吗?如有必要,您始终可以再次将全名与__串在一起。 (我为此输出提供了一个不错的简短解决方案。) -
在这一点上,我确实需要字符串,但如果你有一个潜在的方法但不这样做,我很高兴看到它。如果需要,我可以在之后重新排列它们是(也许我可以修改我的其他代码以接受它)
标签: python recursion group-by itertools