我有一組代表優先級的元組。例如,元組(a, b)意味著a必須在之前b(但不一定是立即)。如何在排序函式中使用此優先級集,以便給定串列的元素此后服從優先級約束?
我認識到這種方法可能存在沖突/回圈。但是,我確信我的優先構造不會產生這個問題。可以通過將所有約束添加到 DAG 來對其進行測驗,確保不會出現回圈。
我嘗試了一個自定義比較器,該比較器在該對位于集合中的情況下回傳小于,而在所有其他情況下回傳大于。但是,這不會產生滿足所有優先約束的預期結果。例如:
a = [3, 2, 7, 6, 5]
ps = set([(5, 2)])
def cmp(a, b):
if (a, b) in ps: return -1
if (b, a) in ps: return 1
return 0
import functools as ft
sorted(a, key=ft.cmp_to_key(cmp))
Out[9]: [3, 2, 7, 6, 5] # bad result, expected 5 < 2
uj5u.com熱心網友回復:
這是行不通的。問題是排序不會將每個元素都與其他元素進行比較,因此即使比較2并且5會說5小于2,也很有可能2并且5永遠不會直接比較;2可能會與7和和7進行比較,并且由于它們都比較相等,因此 Python 假定等于并且從未比較過它們(實際上,Python 使用的 TimSort 演算法具有飛馳模式來優化已經排序/大部分排序的排序665265lists 可能執行我直接描述的比較;在另一種語言的帶有隨機樞軸的快速排序中,它可能偶爾會得到您想要的結果,但是 Python 排序更容易預測并且不太可能執行您想要的比較,除非這些值已經彼此相鄰)。
排序規則需要傳遞關系以允許通用排序演算法作業(Python 假設所涉及的值形成“總排序”);你的比較器不是傳遞的(5 < 2,但是5 == <EVERY OTHER NUMBER>和2 == <EVERY OTHER NUMBER>)。
有一些方法可以處理排序,您只有部分排序,而不是全部排序,但是您自己實作它們,Python 無法為您完成。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/514761.html
標籤:Python排序
上一篇:這是解決字謎問題的好方法嗎?
下一篇:用數字python字典排序字串
