Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 17, 2016 10:50:06

svfct1977
Зарегистрирован: 2015-12-03
Сообщения: 1
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите разобраться с задачей с Checkio

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

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

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”: “ ”}

Офлайн

#2 Авг. 31, 2016 09:41:53

scidam
Зарегистрирован: 2016-06-15
Сообщения: 288
Репутация: +  35  -
Профиль   Отправить e-mail  

Помогите разобраться с задачей с Checkio

Попробовал написать с нуля используя рекурсивный вызов функци, работает:

 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)

Офлайн

#3 Авг. 31, 2016 11:22:55

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

Помогите разобраться с задачей с Checkio

Получилось такое

 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)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version