簡體   English   中英

根據字典中的“依賴項”對python列表進行排序

[英]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具有“依賴項” 6465 ,因此這兩個值必須在foo排序更高。

我相信我可以拼湊出一些東西,但我對算法和/或其他方法來解決這種排序場景感興趣。 謝謝。

更新:評論中的許多人指出這可能是圖形/拓撲問題。 謝謝你,因為這實際上是對圖中節點進行排序的更大任務的一部分。

更新:建議查看toposort ,這正好符合要求。

所以,把所有的評論放在一起:

您的情況對應於有向圖,其中每條邊都是一個依賴項。 對有向(非循環)圖或短 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM