如何使用特定逻辑对数组进行排序

how to sort an array with a specific logic

我希望对以下数组进行排序,使事件之间的 'distance' 最大。

示例:

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 必须排在第一位,除非如果 y-x 更大,那么它应该被推得更远。 在这个例子中它有 [2:8] 这意味着距离是 6

我做了什么?

events = sorted(events, key = lambda x: x[0])

结果:

[[1, 2], [1, 2], [2, 8], [3, 4]]

但我不知道如何为距离添加另一个逻辑

和你一样,只是按数字之间的增量排序:

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

您可以通过将键制成元组来按两个不同的事物排序。这是您要找的吗?

events = sorted(events, key = lambda x: (x[1] - x[0], x[0]))

这主要是为了让差异较大的对排在列表的末尾,而差异较小的对排在列表的开头。如果可能出现负面差异,那将是第一个。其次,根据第一个值对具有相同距离的对进行排序。