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