문제

데이터:종속 목록 이미 인증을 비순환.그래서 여기서'a'에 따라 달라집'b','c'(c 에 따라 달라집 d),등등....

A = { 'a' :  dict(b=1, c=1),
    'c' : dict(d=1),
    'd' : dict(e=1,f=1,g=1),
    'h' : dict(j=1)
    }

내가 갖고 싶 top-down,재귀적인 솔루션을 말하자 체인을 찾을 수 있에서 시작 'a':a,c,d,e,g,f,b

그래서 지금 바로(비전기 발전기 솔루션):

def get_all(D,k):
    L = []
    def get2(D,k):
        L.append(k)
        for ii in D.get(k,[]):
            get2(D, ii)
    get2(D,k)
    return L

물론,이것은 매우 약합니다:)I've 두드리는 내 머리를하는 방법에 대해 어떻게 얻을 수확량 내부에 있는,나는 감사하겠 어떤 py-foo y'all 을 가져올 수 있습니다.

도움이 되었습니까?

해결책

이것을 보십시오:

#!/usr/bin/env python

def get_all(D, k):
    yield k
    for ii in D.get(k, []):
        for jj in get_all(D, ii):
            yield jj

A = { 'a' : dict(b=1, c=1),
    'c' : dict(d=1),
    'd' : dict(e=1,f=1,g=1),
    'h' : dict(j=1)
    }

for ii in get_all(A,'a'):
    print ii

steve@rei:~/code/tmp
$ python recur.py
a
c
d
e
g
f
b

다른 팁

모두 답이 같은 결과하지만,경우 나의 질문은 정확하게 잘못된 응답을 간단한 변화를 주는 그래프를 추가하는 경우에 종속'c'from'b'(지 않는 도입하기로 그래프시)출력은 다음과 같습니다. a c d e g f b d e g f

지 않는 완전히 유용합니다.이 작은 변화를 추적하는 노드의 그래프 이미 많이 방문한:

def get_all(D, k, seen=None):
    if not seen:
        seen = set( )
    if k not in seen:
        seen.add(k)
        yield k
        for ii in D.get(k, []):
            for jj in get_all(D, ii, seen):
                yield jj
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top