【问题标题】:python - return flat list of objects from recursive functionpython - 从递归函数返回对象的平面列表
【发布时间】:2015-12-02 14:24:25
【问题描述】:

我有一个递归函数,它遍历任意数量的对象,他们的孩子收集年龄符合过滤年龄的孩子。

在这种情况下,我希望遍历每个人和他们的孩子,收集年龄为 2 或 4 岁的任何人。但是我不完全确定如何连续构建一个列表然后返回它。现在它只返回最后找到的人。

更新 我对递归函数进行了一些更改,以始终附加到传递的变量。这是一个合适的解决方案吗?

from random import randint

NODES = []

class Person():
    def __init__(self, name="", age=0, children=None):
        self.name = name
        self.age = (randint(0,4))
        self.children = children if children is not None else []

for x in xrange(5):
    new = Person()
    NODES.append( new )
    for c in xrange(5):
        new.children.append( Person() )


def get_nodes(items=[], ages=[], results=[]):
    print "Searching..."
    # pseudo code
    for item in items:
        if item.age in ages:
            print "\t","valid age"
            results.append(item)

        results + get_nodes(items=item.children, ages=ages, results=results)

    return results


AGED_NODES = get_nodes( items=NODES, ages=[2, 4], results=[])
print len(AGED_NODES)
print AGED_NODES

【问题讨论】:

  • 将其包装在一个非递归函数 A 中并从 A 返回扁平列表。

标签: python


【解决方案1】:

对我来说,像 get_nodes 这样的递归函数应该只返回自己的结果似乎更合乎逻辑——调用者可以添加自己的结果,调用者的调用者也这样做。所以不,我不会将“结果”传递给 get_nodes。

还要注意你的行:

results + get_nodes(items=item.children, ages=ages, results=results)

什么都不做。

所以我的代码版本如下:

def get_nodes(items=[], ages=[]):
    myresults = []
    print "Searching..."
    # pseudo code
    for item in items:
        if item.age in ages:
            print "\t","valid age"
            myresults.append(item)

        myresults.extend( get_nodes(items=item.children, ages=ages) )

    return myresults

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-09
    • 2016-05-27
    • 1970-01-01
    • 2021-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多