Suppose I have the following list foo that I would like to sort:
foo = [63,64,65]
To inform the sort, I have the following dictionary of "dependencies", where if a value is in a list for a key, that value must sort higher than the key in list foo:
bar = {
63: [64, 65],
64: [65]
}
For example, looking at list foo, we see the value 63 at index 0. But, checking the dictionary bar, we see that 63 has "dependencies" 64 and 65, so both those values must sort higher in foo.
I'm confident I could cobble something together, but am interested in algorithms and/or other approaches to solve this sorting scenario. Thanks.
UPDATE: Many in the comments have pointed out this is likely a graphing / topological problem. Thanks for that, as this is, in fact, part of a larger task of sorting nodes in a graph.
Update: toposort was sugggested to look at, and this precisely fits the bill.
So, putting all the comments together:
Your situation corresponds to a directed graph, where each edge is a dependency. The right way to sort a directed (acyclical) graph, or short DAG, is called topological sorting.
In Python there is already a package that can do this, toposort.
It requires, however, that your values are sets, not lists, but that is easy to fix:
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)
Since it sound like your graph may contain entries which are not in foo, you could sort foo like this:
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]
Or, if the graph is a lot larger than the list you want to sort (and iterating over it takes a lot of time), build a dictionary:
graph_sorted_lookup = {x: i for i, x in enumerate(sorted_graph)}
foo_sorted = sorted(foo, key=graph_sorted_lookup.get)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With