Определить четную / нечетную итерацию в рекурсивной функции Python - PullRequest
0 голосов
/ 11 февраля 2020

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

d = {1: {2: {3: {}}, 4: {5: {}}, 6: {}}, 7: {8: {}}}

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

def recurse(d):
    for k, v in d.items():
        print(f"key: {k}")
        if v:
            recurse(v, level + 1)

Я хочу напечатать только ключ, если мы на итерации ДАЖЕ. Похоже, я могу сделать это, используя глобальную переменную count:

count = 0

def recurse_toggle(d):
    global count
    for k, v in d.items():
        if count % 2 == 0:
            print(f"key: {k} (count={count})")
        count += 1
        if v:
            recurse_toggle(v)
# key: 1 (count=0)
# key: 3 (count=2)
# key: 5 (count=4)
# key: 7 (count=6)

Однако я не хочу использовать глобальную переменную, потому что это плохая практика. Как я могу реорганизовать эту функцию, чтобы сделать это БЕЗ использования глобальной переменной? Примечание. Мне не нужен параметр count (может, лучше передать параметр is_even?).

Ответы [ 2 ]

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

Вы можете просто отслеживать уровень и увеличивать его при каждом рекурсивном вызове. Инициализируется в 0.

>>> def recurse_toggle(d, level=0):
...     for k, v in d.items():
...         if level % 2 == 0:
...             print(f"key: {k}")
...         recurse_toggle(v, level+1)
... 
>>> recurse_toggle(d)
key: 1
key: 3
key: 5
key: 7
0 голосов
/ 11 февраля 2020

Если вы не хотите, чтобы count был глобальным, просто переместите все в локальную область

def recurse(d):
    count = 0

    def _recurse(d):
        nonlocal count
        for k, v in d.items():
            if count % 2 == 0:
                print(f"key: {k} (count={count})")
            count += 1
            if v:
                _recurse(v)
    _recurse(d)

Также имейте в виду, что на порядок dict элементов не следует полагаться , так как этот заказ не гарантируется

...