[英]How to sort list of tuples based on variable in tuple
給定一個以這種格式 (item,[dependency, priority]) 的元組列表,其中第一個元素表示一個項目,第二個元素的第一個元素表示對先前列出的項目的依賴(這意味着,第一個元素必須出現在它所依賴的第二個項目之前的列表出現),最后第三個元素指示相似依賴項的排名優先級。 示例列表如下所示:
[(1, [0, 4]),
(2, [0, 3]),
(3, [1, 4]),
(4, [1, 1]),
(5, [2, 4])]
我需要一種對列表進行排序的方法,以便滿足依賴性的項目可以比具有較低優先級但具有較少或沒有依賴性的項目排名更高。
例如,在上面的列表中,第三項 (3, [1, 4]) 的優先級高於第二項 (2, [0, 3]),因此應該在第二個 position 中。 示例列表中所需的 output 應該是這樣的:
[(1, [0, 4]),
(3, [1, 4]),
(2, [0, 3]),
(5, [2, 4]),
(4, [1, 1])]
我不能簡單地按優先級排序,因為這會將第五項 5, [2, 4]) 提升到高於其依賴項 2 的位置。
所以我的想法是遍歷列表,將滿足依賴關系的所有項目分組。 然后按優先級對該列表進行排序。 然后將所有結果列表重新組合成一個列表。
我無法弄清楚如何做到這一點。 我最好的嘗試是下面這樣。 依賴為 n。 但它只適用於第一次迭代。 當依賴項大於 1 時,它返回所有項。 我懷疑這不是實現預期結果的最佳策略。
任何想法或建議將不勝感激!
def rank_poss(array,n):
final = []
slot_list = []
for i in array:
if i[1][0] <= n and i[0] != 1:
slot_list.append(i)
temp = sorted(slot_list, reverse=True, key = lambda x: x[1][2])
final.append(temp)
return final
我不知道我是否正確理解了你的規則,所以我不知道我是否得到正確的結果。
在較舊的 Python 中,您可以使用帶參數cmp=的sorted
(以及少數其他函數)來分配 function ,它從列表中獲取兩個項目,比較它們並在它們相同時返回0
,當第一個應該在第二個之前時返回1
,當第二個時返回-1
應該在前。
新的 Python 沒有這個參數,但是 function functools.cmp_to_key()應該有助於像舊的cmp=
一樣工作,然后您可以嘗試創建更復雜的方法來對項目進行排序。
data = [
(1, [0, 4]),
(2, [0, 3]),
(3, [1, 4]),
(4, [1, 1]),
(5, [2, 4])
]
import functools
def compare(a, b):
if a[1][0] >= b[0]:
return 1
if a[1][1] > b[1][1]:
return -1
return 1
result = sorted(data, key=functools.cmp_to_key(compare))
for item in result:
print(item)
結果:
(1, [0, 4])
(3, [1, 4])
(2, [0, 3])
(5, [2, 4])
(4, [1, 1])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.