我正在尝试横穿由字典字典组成的树状结构,其中最低级别的字典包含列表。下面是一个结构示例:
Metabolism[currentL0][currentL1][currentL2][node] = [pathway1, pathway2, pathway3]
我使用这个函数来创建数据结构:
Tree = lambda: defaultdict(Tree)
Metabolism = Tree()
生成和填充数据结构的代码有效。但是,我尝试使用递归生成器来遍历“树”并返回顶部键以及与其关联的所有列表。生成器函数通过 if isinstance
测试工作。它进入 if
block 打印 hi
并将正确的值分配给 key
,但是,它似乎跳过了递归调用并打印 再见
。为了测试这一点,我将 print key
语句放置在函数顶部,并在递归调用中将 key
设置为 recursive
,以便 print key
语句应该打印单词 recursive
,但事实并非如此。这是生成器函数:
def walk_dict(d,depth=0,key=""):
print key
for k,v in d.items():
if isinstance(v, defaultdict):
print "hi"
if depth == 0:
key = k
walk_dict(v,depth+1,"recursive")
print "bye"
else:
yield key, v
测试 print
语句似乎确认该函数不是递归的。它打印一个空行,后跟与顶级字典键相同数量的 hi
和 bye
。以下是输出示例:
<blank line>
hi
bye
hi
bye
hi
bye
hi
bye
hi
bye
hi
bye
最后,这是调用生成器函数的代码:
for x,y in walk_dict(Metabolism):
pass
最佳答案
问题是当你进行递归调用时,你没有产生结果。替换这一行:
walk_dict(v,depth+1,"recursive")
用这一行:
for item in walk_dict(v,depth+1,"recursive"):
yield item
如果您运行的是 Python 3,则可以使用 yield from
构造:
yield from item in walk_dict(v,depth+1,"recursive"):
更新
要回答您的问题,请考虑以下调用的作用:
walk_dict(v,depth+1,"recursive")
在原始代码中,您只需调用 walk_dict
,它会返回一个生成器。但是,您没有从该生成器中提取任何有用的列表并返回给调用者。
关于python - 递归函数不递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31237883/