[英]sorting python list based on "dependencies" from dictionary
假設我有以下列表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.