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