获取递归函数后的数据列表

时间:2013-11-21 10:42:36

标签: python recursion

我需要使用递归来运行db并在结尾处获取结果列表。函数工作正常(如果打印unrem)但我不能返回结果列表。

def find_locks(item, ids):
    if item.video_id:
        #print (item.video_id, ids)
        return (item.video_id, ids)
    for i in CatalogItem.objects.filter(parent=item):
        if i.is_lock:
            find_locks(i, ids.append(i.id))
        else:
            find_locks(i, ids)

如何获得列表结果?

3 个答案:

答案 0 :(得分:3)

我使用递归生成器而不是构建列表:

def find_locks(item, ids):
    if item.video_id:
        yield (item.video_id, ids)
    for i in CatalogItem.objects.filter(parent=item):
        nxt = ids + [i.id] if i.is_lock else ids
        for x in find_locks(i, nxt):
            yield x

在python 3.3中,你可以使用yield from作为最后一部分。

答案 1 :(得分:1)

您可以简单地将每个结果存储在列表中并在结尾处返回:

def find_locks(item, ids):
    if item.video_id:
        return [(item.video_id, ids)]
    result = []
    for i in CatalogItem.objects.filter(parent=item):
        if i.is_lock:
            result.extend(find_locks(i, ids + [i.id]))
        else:
            result.extend(find_locks(i, ids))
    return result

请注意,您还需要返回列表中的每个项目,因为对find_locks的其他调用期望接收列表作为返回值。

答案 2 :(得分:1)

尝试以下内容:

def find_locks(item, ids):
    if item.video_id:        
        return [(item.video_id, ids)]
    res = []
    for i in CatalogItem.objects.filter(parent=item):
        if i.is_lock:
            res.extend(find_locks(i, ids + [i.id]))
        else:
            res.extend(find_locks(i, ids))
    return res

在基本情况下,您返回的列表中只包含一个项目。如果它不是基本情况,则创建一个新列表,执行递归调用,使用递归调用的结果扩展列表并返回此列表。