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

Python 获取递归函数后的数据列表,python,recursion,Python,Recursion,我需要使用递归遍历数据库,并在最后得到一个结果列表。函数工作正常(如果打印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

我需要使用递归遍历数据库,并在最后得到一个结果列表。函数工作正常(如果打印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)

如何获取列表结果?

您只需将每个结果存储在一个列表中,并在最后返回:

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\u locks
的其他调用预期会收到一个列表作为返回值。

您只需将每个结果存储在列表中,并在最后返回:

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\u locks
的其他调用预期会收到列表作为返回值。

请尝试以下操作:

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

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

尝试以下操作:

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

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

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

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

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

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
作为最后一部分。

您可以编写一些输入和输出示例吗?您只在“if”分支中返回结果。您需要为find_locks或return find_lock赋值。您可以编写一些输入和输出示例吗?您只在“if”分支中返回结果。您需要为find_locks或return find_lock赋值return find_lock我知道它也出现在greg的OP中,但是
ids.append(i.id)
将返回
None
,这可能不是他想的。我知道它也出现在greg的OP中,但是
ids.append(i.id)
将返回
None
,这可能不是他想的。我知道它也在格雷格的作品中,但是
ids.append(I.id)
将返回
None
,这可能不是他想的。我知道它也在格雷格的作品中,但是
ids.append(I.id)
将返回
None
,这可能不是他想的。我认为这个变量是最好的,但是ID总是以空列表的形式返回,真实数据有带ID的列表。我认为这个变量是最好的,但是ID总是以空列表的形式返回,真实数据有带ID的列表。