Trim python словарь на основе уровня остановки рекурсии - PullRequest
0 голосов
/ 07 февраля 2020

Допустим, у меня есть следующий Python словарь:

d = {1: {2: {3: {}}, 6: {7: {}}, 8: {}, 9: {}}, 10: {11: {}}}

Я могу рекурсивно пройти до определенного уровня в объекте, используя следующую функцию:

def resurse_stop(d, stop=None, curr=0):
    if stop and curr == stop:
        return
    for k, v in d.items():
        print(f"{k} (level={curr})")
        if v:
            resurse_stop(v, stop, curr + 1)

resurse_stop(d, 1)
# 1 (level=0)
# 10 (level=0)

resurse_stop(d, 2)
# 1 (level=0)
# 2 (level=1)
# 6 (level=1)
# 8 (level=1)
# 9 (level=1)
# 10 (level=0)
# 11 (level=1)

Как Могу ли я создать новый объект на основе уровня остановки, который аналогичен функции resurse_stop, описанной выше, но вместо печати данных он создает объект. Давайте назовем функцию resurse_stop_obj и вот несколько примеров того, что она должна вернуть:

resurse_stop(d, 1)
# d = {1: {}, 10: {}}

resurse_stop(d, 2)
# d = {1: {2: {}, 6: {}, 8: {}, 9: {}}, 10: {11: {}}}

1 Ответ

1 голос
/ 07 февраля 2020

Оберните ваше print выражение в сложное понимание:

d = {1: {2: {3: {}}, 6: {7: {}}, 8: {}, 9: {}}, 10: {11: {}}}

def resurse_stop(d, stop=None, curr=0):
    if stop and curr == stop:
        return {}

    return {k: {} if not v else resurse_stop(v, stop, curr + 1)
               for k, v in d.items() }

print(resurse_stop(d, 2))

Вывод:

{1: {2: {}, 6: {}, 8: {}, 9: {}}, 10: {11: {}}}
...