【问题标题】:How to count in this recursive function?如何计算这个递归函数?
【发布时间】:2019-05-20 17:33:28
【问题描述】:

我想遍历嵌套字典(您可以在下面看到):

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))

我有兴趣在字典中计算结果(如果 key 得到“tense”并且 value 得到“Pres”),那应该是,如果递归过程完成,返回为

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

但在进行故障排除时,我发现它甚至没有正确计数,“动词”-字典停留在 0/0。

我的递归一定有问题,我是一个初学者,我只是不知道我应该怎么做才能完成它。

【问题讨论】:

  • 拥有可变的默认参数(例如dictlistset)是不好的做法。默认参数被定义一次(在函数定义时),并且在函数中对它们所做的任何更改都将持续到进一步的调用
  • 很想摆脱它们,我只是不知道替代解决方案:)
  • 看起来您正在覆盖动词的值。尝试以下两种方法之一:(1)定义一个字典并在递归调用中分配给它但不返回它(需要一个特殊的标记,我们在顶层,所以应该返回一些东西)(2)传入每个递归调用都有一个不同的字典,并将其结果与您的“主”(在此级别)字典合并
  • 有必要这样遍历字典吗?看起来您可以使用 dict.get 搜索 attributes
  • 您在故障排除过程中是否检查/打印了任何内容?在返回之前 it 进入嵌套字典的深度有多少?该函数的基本情况是什么?

标签: python dictionary recursion count nested


【解决方案1】:

下面有两种方法可以调用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"]

【讨论】:

  • 非常感谢,它成功了,我终于明白我做错了什么!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 2015-08-21
  • 2011-03-29
相关资源
最近更新 更多