【问题标题】:Python recursion with yield and return in nested dictionaryPython递归与嵌套字典中的yield和return
【发布时间】:2016-11-05 13:26:39
【问题描述】:

我正在尝试学习在递归函数中使用 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 会在上面的代码中完成它的工作。现在,如果我使用相同的代码,但使用 return 并在那里检查是否有空返回,我仍然会遇到“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

我在这里错过了什么?

【问题讨论】:

  • 什么是“NoneType 迭代问题”?我不明白你的问题。请告诉我们预期结果是什么以及给定输入实际发生了什么。这两个代码之间的区别之一是,如果 Python 没有到达任何 return 语句(由于没有满足任何条件),那么它将到达函数的末尾并返回 None
  • 当一个值和嵌套字典被传递给函数时,预期的结果是它应该迭代,如果它找到该值的实例然后将它返回给调用者,以便我们可以确认一个实例是在特定的嵌套字典中找到。 “NoneType”问题是当使用“return”而不是“yield”时,函数无法迭代并停止并出现错误“NoneType”对象不可迭代。我正在尝试找出如何使用 return 语句而不是 yield 来实现相同的结果。

标签: python python-3.x dictionary recursion


【解决方案1】:

我相信你可以改变这一点:

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

到这里:

return valuefind(value, v)

【讨论】:

  • 这会间歇性地工作。例如,它可能会在 10 次执行中找到结果,或者在列表中提供不相关值的结果。
猜你喜欢
  • 2021-10-08
  • 2021-12-04
  • 1970-01-01
  • 2016-12-10
  • 1970-01-01
  • 2012-07-26
  • 1970-01-01
  • 1970-01-01
  • 2021-11-01
相关资源
最近更新 更多