如何使用特定逻辑对数组进行排序
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]))
这主要是为了让差异较大的对排在列表的末尾,而差异较小的对排在列表的开头。如果可能出现负面差异,那将是第一个。其次,根据第一个值对具有相同距离的对进行排序。
我希望对以下数组进行排序,使事件之间的 '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]))
这主要是为了让差异较大的对排在列表的末尾,而差异较小的对排在列表的开头。如果可能出现负面差异,那将是第一个。其次,根据第一个值对具有相同距离的对进行排序。