嵌套字典中带有yield和return的Python递归

时间:2016-07-03 20:37:41

标签: python python-3.x dictionary recursion

我正在尝试学习在递归函数中使用yield和return。我有一个嵌套字典,我正在寻找一个特定的值。

使用“yield”时,以下函数运行正常并成功返回找到的值:

def findvalue (value, document):
    if isinstance (document, list):
        for d in document:
            for result in findvalue(value, d):
                yield result
    if isinstance (document, dict):
        for k,v in document.items():
            if v == value:
                yield v
            elif isinstance (v, dict):
                for result in findvalue(value, v):
                    yield result
            elif isinstance (v, list):
                for d in v:
                    for result in findvalue(value, d):
                        yield result

我理解生成器如何工作以及为什么yield会在上面的代码中完成它的作用。现在,如果我使用相同的代码,但返回并在那里检查空返回,我仍然会遇到“NoneType”迭代问题,因为在这个代码中返回一个空结果:

def valuefind (value, document):
    if isinstance (document, list):
        for d in document:
            for result in valuefind(value, d):
                if result is not None:
                    return result          
    if isinstance (document, dict):
        for k, v in document.items():
            if v == value:
                return v
            elif isinstance (v, dict):
                for result in valuefind(value, v):
                    if result is not None:
                        return result
            elif isinstance (v, list):
                for d in value:
                    for result in valuefind(value, d):
                        if result is not None:
                            return result

我在这里缺少什么?

1 个答案:

答案 0 :(得分:0)

我相信你可以改变这个:

for result in valuefind(value, v):
                    if result is not None:
                        return result

对此:

return valuefind(value, v)