Как считать в этой рекурсивной функции? - PullRequest
0 голосов
/ 20 мая 2019

Я хочу перебрать вложенный словарь (который вы можете увидеть ниже):

bsp = {'bewohnen': {'lemma': 'bewohnen', 'pos': 'VFIN', 'attributes': {'type': 'Full', 'person': '3', 'number': 'Pl', 'tense': 'Pres', 'mood': 'Ind'}},
       'bewirtschaften': {'lemma': 'bewirtschaften', 'pos': 'VFIN', 'attributes': {'type': 'Full', 'person': '3', 'number': 'Pl', 'tense': 'Pres', 'mood': 'Ind'}},
       'die': {'lemma': 'die', 'pos': 'ART', 'attributes': {'type': 'Def', 'case': 'Nom', 'number': 'Pl', 'gender': 'Masc'}}, 'vier': {'lemma': 'vier', 'pos': 'CARD', 'attributes': None},
       'Viertel': {'lemma': 'Viertel', 'pos': 'N', 'attributes': {'type': 'Nom', 'case': 'Nom', 'number': 'Pl', 'gender': 'Neut'}}}

#Code:

def iterdict(d, verbs={"all":0,"pres":0}):
        for k,v in d.items():

            if isinstance(v, dict):
               verbs = iterdict(v, verbs)
            elif k == "tense":
                verbs["all"]+= 1
                if v == "Pres":
                    verbs["pres"]+= 1
            return verbs


        return verbs["pres"]//verbs["all"]


print(iterdict(bsp))

Меня интересует подсчет результатов (если ключ становится «напряженным», а значение получает «Pres») в словаре, то есть, если процесс рекурсии завершен, возвращается как

return verbs["pres"]//verbs["all"]

но при устранении неполадок я увидел, что он даже не считается должным образом, словарь "глаголы" остается на 0 / 0.

Что-то должно быть не так с моей рекурсией, я новичок, и я просто не знаю, что мне нужно сделать, чтобы это сделать.

1 Ответ

1 голос
/ 20 мая 2019

В дальнейшем существует два способа вызова iterdict. Если вы вызываете его без второго аргумента, он внутренне инициализирует пару счетчиков равным 0. В противном случае он мутирует данную пару счетчиков.

Первоначальный вызов iterdict производится без счетчиков. Рекурсивные вызовы принимают текущую пару отсчетов, которые обновляются на месте внутри рекурсивного вызова. Возвращаемое значение каждого рекурсивного вызова на самом деле не представляет интереса, поэтому его можно игнорировать.

def iterdict(d, counts=None):
    if counts is None:
        counts = dict(all=0, pres=0)

    for k,v in d.items():

        if isinstance(v, dict):
            iterdict(v, counts)
        elif k == "tense":
            counts["all"] += 1
            if v == "Pres":
                counts["pres"] += 1


    return counts["pres"] // counts["all"]
...