假设我要排序以下列表data_bytes = { << byte {j}};
:
shutdown /r /t 0
要通知排序,我有以下“ dependencies”字典,其中在键的列表中如果值,则该值< / strong>的排序必须高于列表foo
中的键:
foo = [63,64,65]
例如,查看列表foo
,我们在索引bar = {
63: [64, 65],
64: [65]
}
上看到值foo
。但是,在检查字典63
时,我们发现0
具有“依赖项” bar
和63
,因此这两个值在64
中的排序必须更高。 / p>
我相信我可以将一些东西拼凑在一起,但是对解决这种分类情况的算法和/或其他方法很感兴趣。谢谢。
更新:许多评论指出这很可能是图形/拓扑问题。为此,事实上,这是对图形中的节点进行排序的一项较大任务的一部分。
更新:建议toposort查看,这完全符合要求。
答案 0 :(得分:3)
因此,将所有评论放在一起:
您的情况对应于有向图,其中每个边都是从属。排序有向(非循环)图或简称DAG的正确方法称为topological sorting。
在Python中,已经有一个可以执行此操作的软件包toposort
。
但是,它要求您的值是集合,而不是列表,但这很容易解决:
colnames(df)<- <cols from data>
由于听起来您的图表可能包含不在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]