위상적 분류,재귀,사용하는 발전기
문제
데이터:종속 목록 이미 인증을 비순환.그래서 여기서'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
제휴하지 않습니다 StackOverflow