Итак, собрав все комментарии вместе:
Ваша ситуация соответствует ориентированному графу, где каждое ребро является зависимостью.Правильный способ сортировки ориентированного (ациклического) графа или короткой DAG называется топологическая сортировка .
В Python уже есть пакет, который может это сделать, toposort
.Однако требуется, чтобы ваши значения были наборами, а не списками, но это легко исправить:
from toposort import toposort_flatten
bar = {
63: [64, 65],
64: [65]
}
graph = dict(zip(bar.keys(), map(set, bar.values())))
sorted_graph = toposort_flatten(graph, sort=True)
Так как ваш график может содержать записи, которые не находятся в foo
, вы можете отсортироватьfoo
вот так:
foo = [63,64,65]
foo_set = set(foo)
foo_sorted = [x for x in sorted_graph if x in foo_set]
print(foo_sorted)
# [65, 64, 63]
Или, если график намного больше, чем список, который вы хотите отсортировать (и итерации по нему занимают много времени), создайте словарь:
graph_sorted_lookup = {x: i for i, x in enumerate(sorted_graph)}
foo_sorted = sorted(foo, key=graph_sorted_lookup.get)