我正在尝试使用内置的sorted()函数解决我的问题,或者如果我需要自己做-使用cmp的老派相对容易。 我的数据集如下所示: 排序规则基本上应该适用于N和Y的所有值,其中Y> N,x [N] [0]不在x [Y] [1]中 尽管我正在使用cmp参数仍然可用的Python ...
提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供 中文繁体 英文版本 中英对照 版本,有任何建议请联系yoyou2525@163.com。
假设我有以下列表foo
想要排序:
foo = [63,64,65]
为了通知排序,我有以下“依赖项”字典,其中如果某个值在key的列表中,则该值的排序必须高于列表foo
的键:
bar = {
63: [64, 65],
64: [65]
}
例如,查看列表foo
,我们在索引0
处看到值63
。 但是,检查字典bar
,我们看到63
具有“依赖项” 64
和65
,因此这两个值必须在foo
排序更高。
我相信我可以拼凑出一些东西,但我对算法和/或其他方法来解决这种排序场景感兴趣。 谢谢。
更新:评论中的许多人指出这可能是图形/拓扑问题。 谢谢你,因为这实际上是对图中节点进行排序的更大任务的一部分。
所以,把所有的评论放在一起:
您的情况对应于有向图,其中每条边都是一个依赖项。 对有向(非循环)图或短 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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.