2009-06-04 26 views
8

Mam klasę, która ma listę "zależności" wskazujące na inne klasy tego samego typu podstawowego.Jak sortować według zależności?

class Foo(Base): 
    dependencies = [] 

class Bar(Base): 
    dependencies = [Foo] 

class Baz(Base): 
    dependencies = [Bar] 

Chciałbym posortować wystąpienia, które te klasy generują na podstawie ich zależności. W moim przykładzie spodziewałbym się, że najpierw pojawią się instancje Foo, potem Bar, a potem Baz.

Jaki jest najlepszy sposób na sortowanie?

+1

Pytasz o topologicznej rodzaju w Pythonie? http://en.wikipedia.org/wiki/Topological_sorting –

+1

Może chcieć szukać "sortowania skierowanego wykresu", ponieważ jest to zasadniczo to, co próbujesz zrobić. –

Odpowiedz

18

To się nazywa topologiczne.

def sort_deps(objs): 
    queue = [objs with no dependencies] 
    while queue: 
     obj = queue.pop() 
     yield obj 
     for obj in objs: 
      if dependencies are now satisfied: 
       queue.append(obj) 
    if not all dependencies are satisfied: 
     error 
    return result 
+0

Chociaż masz prawo do rozwiązania problemu, nie jest to naprawdę kompletny/użyteczny przykład. – sleepycal

+0

@leepycal: Ta strona służy do odpowiadania na pytania, a nie do dostarczania kompletnych rozwiązań problemów. –

+1

To kiepski argument, opublikowałeś fragment kodu, który nie działa. To tylko lenistwo. – sleepycal

5

W zeszłym tygodniu miałem podobne pytanie - chciałbym wiedzieć o Stack Overflow! Trochę polowałem, dopóki nie zdałem sobie sprawy, że mam wykresy, ponieważ moje zależności nie mogą być rekurencyjne lub okrągłe. Następnie znalazłem kilka odniesień dla algorytmów do ich sortowania. Użyłem pierwszego przejścia przez głębokość, aby dostać się do węzłów liści i najpierw dodać je do posortowanej listy.

Oto strona, że ​​znalazłem przydatne:

Directed Acyclic Graphs

+2

Interesujące ... ale bez linków do innych zasobów. Czy możesz podać niektóre linki, aby ukończyć odpowiedź na to pytanie? –

+2

Dodałem link powyżej. Będąc nowym, pozwoliłoby mi to tylko uwzględnić jeden z moich postów, więc tutaj jest jeszcze jedno dobre tło: http://www.codeproject.com/KB/java/BFSDFS.aspx –

+0

Dzięki, link podany w odpowiedzi jest całkiem niezły. Chciałabym tylko, żeby te uniwersyteckie typy mogły od czasu do czasu wstawiać prawdziwą grafikę zamiast sztuki ansi. hehe – Soviut

Powiązane problemy