2009-06-04 5 views
8

Aynı temel türdeki diğer sınıfları işaret eden bir "bağımlılıklar" listesi olan bir sınıfa sahibim.Bağımlılıklara göre nasıl sıralanır?

class Foo(Base): 
    dependencies = [] 

class Bar(Base): 
    dependencies = [Foo] 

class Baz(Base): 
    dependencies = [Bar] 

Bu sınıfların bağımlılıklarına göre oluşturduğu örnekleri sıralamak istiyorum. Örneğimde, önce Foo'nun, daha sonra Bar'ın, sonra Baz'ın gelmesini beklerdim.

bu sıralamak için en iyi yolu nedir?

+1

Eğer Python bir Topolojik tür konularda soruyorsun:

Burada yararlı bulduğu bir sayfadır? http://en.wikipedia.org/wiki/Topological_sorting –

+1

"Yönlendirilmiş bir grafiği sıralamak" isteyebilirsiniz, çünkü aslında yapmaya çalıştığınız şeydir. –

cevap

18

bir topolojik sıralama denir.

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

Çözüme ihtiyaç duyduğunuz her şeye rağmen, bu gerçekten eksiksiz/kullanılabilir bir örnek değildir. – sleepycal

+0

@sleepycal: Bu web sitesi, sorularınızı yanıtlamak için, sorunlarınıza eksiksiz çözümler sunmamak içindir. –

+1

Bu zayıf bir argüman, çalışmayan bir kod snippet'i gönderdiniz. Tembellikten başka bir şey değil. – sleepycal

5

Sadece geçen haftaya benzer bir sorum vardı - isterse Stack Overflow hakkında bilgi sahibi olmayı isterdim! (Benim bağımlılıkları özyinelemeli veya dairesel olamazdı çünkü Yönetmen Mercury Grafik) Ben DAG olduğunu fark edene kadar ben biraz etrafında avlanan. Sonra onları sıralamak için algoritmalar için birkaç referans buldum. Yaprak düğümlerine ulaşmak ve bunları önce sıralanmış listeye eklemek için derinlik-ilk geçişi kullandım.

Directed Acyclic Graphs

+2

İlginç ... ama bu diğer kaynaklara bağlantı yok. Bu sorunun cevabını tamamlamak için bazı linkleri sağlayabilir misiniz? –

+2

Yukarıda bir bağlantı ekledim. http://www.codeproject.com/KB/java/BFSDFS.aspx –

+0

sayesinde, kendi cevap verilen bağlantıyı: Yeni varlık, sadece bu yüzden burada bazı iyi birikime sahip olduğunun başka bir şeydir, benim görevde birini içerecek izin verecek oldukça iyi. Keşke bu üniversite türleri gerçekte bir zamanlar sanattan ziyade gerçek bir grafiği ekleyebilir. hehe – Soviut