我需要使用递归来运行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)
如何获得列表结果?
答案 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
在基本情况下,您返回的列表中只包含一个项目。如果它不是基本情况,则创建一个新列表,执行递归调用,使用递归调用的结果扩展列表并返回此列表。