假設我有兩個名為 v1 和 v2 的數字串列。v2 有一些與 v1 相同的數字。它還有其他不在 v1 中的數字。我需要對 v2 進行排序,使得 v1 和 v2 交集處的所有數字都以相同的順序結束;v2 中的順序必須進行最低限度的更改,以僅在共享元素上匹配 v1 中的順序。它應該移動盡可能少的專案,而不是移動不在 v1 中的專案。例子:
v1 = [2, 3, 5, 7, 9]
v2 = [10, 7, 6, 5, 4]
after sort, v2 = [10, 5, 6, 7, 4] or [10, 6, 5, 7, 4]
這些結果中的每一個都有 4 個動作,我看不出用更少的動作來做到這一點。目前我在想我可以建立一個包含所有有序對的集合并在比較器中使用它。但是,當我有大量資料時,這似乎是一個糟糕的計劃,因為我將在我的集合中以 n^2 元組結束。有沒有更好的辦法?
這個問題有點類似于這個 C# 問題:Sort a List based on a Pre-Sorted List。但是,我不確定如何在 Python 中應用這些技術。我也不確定python中的交集是否保留順序(或者我如何將該結果放回更大的串列中)。
uj5u.com熱心網友回復:
如果 v1 中存在值,則可以根據 v1 中的值索引進行排序,否則可以根據 v2 中的值索引進行排序:
>>> sorted(v2, key=lambda x: v1.index(x) if x in v1 else v2.index(x))
[10, 6, 5, 7, 4]
為了提高性能,更好的解決方案可能是創建一個字典,v1以值作為鍵,以索引作為值作為字典的哈希值,然后實作排序:
>>> v1_map={v:idx for idx,v in enumerate(v1)}
>>> list(map(lambda x: x[1], sorted(enumerate(v2), key=lambda x:v1_index if (v1_index:=v1_map.get(x[1])) else x[0])))
[10, 6, 5, 7, 4]
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/514776.html
標籤:Python排序
上一篇:找到給定整數的不同三元組和的數量
下一篇:串列串列的就地快速排序
