2009-06-04 32 views
8

Tengo una clase que tiene una lista de "dependencias" que apunta a otras clases del mismo tipo de base.¿Cómo ordenar según las dependencias?

class Foo(Base): 
    dependencies = [] 

class Bar(Base): 
    dependencies = [Foo] 

class Baz(Base): 
    dependencies = [Bar] 

Me gustaría ordenar las instancias que estas clases generan en función de sus dependencias. En mi ejemplo, esperaría que Foo fuera primero, luego Bar, luego Baz.

¿Cuál es la mejor manera de ordenar esto?

+1

lo preguntas acerca de una clasificación topológica en Python? http://en.wikipedia.org/wiki/Topological_sorting –

+1

Puede que quieras buscar "ordenar un gráfico dirigido", porque eso es básicamente lo que intentas hacer. –

Respuesta

18

Se llama tipo topológico.

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

Aunque tiene razón sobre la solución necesaria, este no es realmente un ejemplo completo/utilizable. – sleepycal

+0

@sleepycal: este sitio web es para responder preguntas, no para proporcionar soluciones completas a sus problemas. –

+1

Ese es un argumento pobre, has publicado un fragmento de código que no funciona. No es más que pereza. – sleepycal

5

Tuve una pregunta similar la semana pasada. ¡Ojalá supiera sobre Stack Overflow! Cacé un poco hasta que me di cuenta de que tenía un DAG (Directed Acyclic Graph, ya que mis dependencias no podían ser recursivas ni circulares). Luego encontré algunas referencias de algoritmos para ordenarlos. Usé un recorrido transversal en profundidad para llegar a los nodos de hoja y agregarlos primero a la lista ordenada.

Aquí hay una página que he encontrado útil:

Directed Acyclic Graphs

+2

Interesante ... pero no hay enlaces a estos otros recursos. ¿Puede proporcionar algunos de los enlaces para completar la respuesta a esta pregunta? –

+2

He agregado un enlace arriba. Siendo nuevo, solo me dejaría incluir uno en mi publicación, así que aquí hay otro que tiene algunos antecedentes: http://www.codeproject.com/KB/java/BFSDFS.aspx –

+0

Gracias, el enlace que brindó en su respuesta es bastante bueno. Solo desearía que estos tipos de universidades realmente pudieran insertar un gráfico real de vez en cuando en lugar de arte ansi. jeje – Soviut

Cuestiones relacionadas