Сортировка по зависимостям

Есть список объектов, у них есть поле, в котором указаны зависимости


class A:
    dependencies = []

class B:
    dependencies = []

class C:
    dependencies = [A]

class D:
    dependencies = [B]

class E:
    dependencies = [A, B, C]

class F:
    dependencies = [E]

class G:
    dependencies = [F]

Изначально весь набор объектов валиден, все объекты в зависимостях имеются, нет цикличности.

Как отсортировать произвольный набор объектов по зависимостям?

Порядок должен быть такой:

  1. Объект встает в список если все зависимости уже добавлены
  2. Если нет какой либо зависимости, ждем пока она появится
  3. Если не осталось объектов с полными зависимостями, то добавляем объекты независимые от уже добавленных
  4. см п 1 (по кругу) пока изначальный список не будет полностью в новом

Подскажите алгоритм?

Примеры входных/выходных данных

> [A, C, E, B, D]
< [A, B, C, D, E] или [A, B, D, C, E] 
> [B, E, A, D, G, F]
< [B, A, D, E, F, G]

Предполагаю, сначала надо пройтись по объектам и записать, какие объекты зависят от них, и смотреть исходя из этих данных


Ответы (1 шт):

Автор решения: Za Ars

На основе полученных комментарием, нашел библиотеку для топологической сортировки.

>>> import graphlib
>>> graph = {"D": {"B", "C"}, "C": {"A"}, "B": {"A"}}
>>> ts = graphlib.TopologicalSorter(graph)
>>> tuple(ts.static_order())
('A', 'C', 'B', 'D')

Это решило проблему без костылизации и велосепедолизации

Спасибо

→ Ссылка