Найти - Пользователи
Полная версия: Помогите разобраться с задачей с Checkio
Начало » Центр помощи » Помогите разобраться с задачей с Checkio
1
svfct1977
Дан словарь, в котором в качестве ключей используются строки, а в качестве значений строки или словари. Необходимо сделать этот словарь “плоским”, но сохранить структуру в ключах. Результатом будет словарь без вложенных словарей. Ключи должны содержать путь, составленный из родительских ключей из начального словаря, разделенных “/”. Если значение ключа есть пустой словарь, тогда оно должно быть заменено пустой строкой (“”).

Никак не пойму как изменить этот код:

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”: “ ”}
scidam
Попробовал написать с нуля используя рекурсивный вызов функци, работает:

 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)
Shaman
Получилось такое
 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)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB