2013-11-21 6 views
1

재귀를 사용하여 db를 실행하고 끝에 결과 목록을 가져와야합니다. 함수가 올바로 작동하지만 (unremove를 인쇄하는 경우) 결과 목록을 반환 할 수 없습니다.재귀 함수 후 데이터 목록 가져 오기

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

일부 입력 및 출력 예제를 쓸 수 있습니까? – itdxer

+0

결과는 'if'분기에만 반환됩니다. – XORcist

+0

find_locks에 대한 할당이 필요하거나 find_locks를 반환해야합니다. – Leifingson

답변

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 

파이썬 3.3에서 마지막 부분 yield from를 사용할 수 있습니다.

+0

이 변형이 최고라고 생각하지만 ** ids **는 항상 빈 목록으로 반환됩니다. 실제 데이터에는 ID가있는 목록이 있습니다. – greg

+0

죄송합니다, 그것은 내 잘못입니다, 모든 작품은 정확합니다! 감사! – greg

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에 다른 통화 목록의 각 항목을 반환뿐만 아니라 때문에 필요 반환 값. 다음과 같은

+0

greg도 OP에 있었지만'ids.append (i.id) '는'None'을 반환 할 것입니다. 이것은 아마도 마음에 들지 않았을 것입니다. – stranac

+0

@stranac 덕분에 업데이트되었습니다. –

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 

기본 경우 당신은 하나 개의 항목 목록을 반환이 포함되어 있습니다. 기본 사례가 아닌 경우 새 목록을 만들고, 재귀 호출을 실행하고, 재귀 호출의 결과로 목록을 확장하고이 목록을 반환합니다.

+1

greg도 OP에 있었지만'ids.append (i.id) '는'None'을 리턴 할 것입니다. 이것은 아마도 그가 마음에 두지 않은 것입니다. – stranac

+0

좋은 지적, @stranac! 내 대답을 업데이트했습니다. – aga

관련 문제