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

2024-06-28 14:45:54 发布

您现在位置:Python中文网/ 问答频道 /正文

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

如何获得列表结果?你知道吗


Tags: 函数idids列表fordbreturnif
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

在python3.3中,可以使用yield from作为最后一部分。你知道吗

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

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的其他调用希望接收列表作为返回值。你知道吗

尝试以下操作:

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

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

相关问题 更多 >