我希望以事件之間的“距離”最大的方式對以下陣列進行排序。
例子:
events = [[1,2],[2,8],[3,4],[1,2]]
最終結果應該是:
events = [[1,2],[1,2],[3,4],[2,8]]
為什么?考慮 [1:2] 其中 x=1 和 y=2 所以 x 必須先出現,除非 yx 更大,那么它應該被推得更遠。在這個例子中它有 [2:8] 這意味著距離是 6
我做了什么?
events = sorted(events, key = lambda x: x[0])
結果:
[[1, 2], [1, 2], [2, 8], [3, 4]]
但我想不出我們如何為距離添加另一個邏輯
uj5u.com熱心網友回復:
和你一樣,只需按數字之間的增量排序:
events = sorted(sorted(events), key = lambda x: x[1]-x[0])
由于 Python 的排序是一種穩定的演算法,首先排序通常會確保[[1,2], [1,2], [3,4]]保持該順序,然后您可以按距離排序。
>>> events = [[1,2],[2,8],[3,4],[1,2]]
>>> events = sorted(sorted(events), key = lambda x: x[1]-x[0])
>>> events
[[1, 2], [1, 2], [3, 4], [2, 8]]
不同(但接近)的解決方案:
events = sorted(events, key = lambda x: (x[1]-x[0], x[0]))
我對任何一個都沒有偏好。在計時測驗中,兩者在 400 項串列上非常相似,但我想這在很大程度上取決于串列大小和串列值等起始條件:
py -m timeit -s "events = [[1,2],[2,8],[3,4],[1,2]]*100" "sorted(sorted(events), key = lambda x: x[1]-x[0])"
1000 loops, best of 5: 214 usec per loop
py -m timeit -s "events = [[1,2],[2,8],[3,4],[1,2]]*100" "sorted(events, key = lambda x: (x[1]-x[0], x[0]))"
1000 loops, best of 5: 220 usec per loop
uj5u.com熱心網友回復:
這是你要找的嗎?
events = sorted(events, key = lambda x: x[1] - x[0])
這種排序使得差異較大的對將位于串列的末尾,而差異較小的對將位于串列的開頭。如果可能出現負面差異,那將是第一個。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/478859.html
