Форум сайта python.su
Дан словарь, в котором в качестве ключей используются строки, а в качестве значений строки или словари. Необходимо сделать этот словарь “плоским”, но сохранить структуру в ключах. Результатом будет словарь без вложенных словарей. Ключи должны содержать путь, составленный из родительских ключей из начального словаря, разделенных “/”. Если значение ключа есть пустой словарь, тогда оно должно быть заменено пустой строкой (“”).
Никак не пойму как изменить этот код:
def flatten(dictionary):
stack =
result = {}
while stack:
path, current = stack.pop()
for k, v in current.items():
if isinstance(v, dict):
stack.append((path + (k,), v))
else:
result = v
return result
Ввод:
print (flatten({“key”: {“deeper”: {“more”: {}}}}))
Вывод : {}
А должен быть : {“key/deeper/more”: “ ”}
Офлайн
Попробовал написать с нуля используя рекурсивный вызов функци, работает:
def flatten(d): res = {} def _flatener(d=d, res=res, stack=[]): for key in d: stack.append(key) if isinstance(d[key], dict): _flatener(d[key], res=res, stack=stack) else: res.update({'/'.join(stack): d[key]}) if stack: stack.pop() _flatener() return res test = {'sim': 'dim', 'cim':{'opa': '1', 'nopa': '2', 'dudu': {'ro':'oro'}}} print test print flatten(test)
Отредактировано scidam (Авг. 31, 2016 09:51:50)
Офлайн
Получилось такое
def describe(data, path=None): for k, v in data.items(): np = (path or []) + [k] if isinstance(v, dict): if v: for i in describe(v, np): yield i continue else: v = ' ' yield '/'.join(np), v result =dict(describe({'key': {'deeper': {'more': {}}}})) print(result)
Офлайн