У меня есть словарь, который выглядит следующим образом:
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'}
Я хочу разделить ключи по '__'
и сгруппировать их, затем разделить эти ключи по '__'
и сгруппировать их, et c., пока больше нет возможности группировки.
В конце я получу такой результат:
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
вниз на каждом уровне группировки, я, кажется, получить желаемый результат. и когда он достигает конечного уровня, на котором больше не может происходить группировка, он возвращает None. Мне кажется, я просто пропускаю пару последних шагов, чтобы собрать все воедино.
Пожалуйста, помогите экспертам по кодированию !!