【发布时间】:2020-07-09 17:01:54
【问题描述】:
我正在尝试对以下列表进行排序:
points = [[1, 4, 'start'], [1, 6, 'start'], [2, 8, 'end'], [2, 5, 'end'], [3, 4, 'end'], [3, 9, 'start']]
预期输出:
[[1, 6, 'start'], [1, 4, 'start'], [2, 5, 'end'], [2, 8, 'end'], [3, 9, 'start'], [3, 4, 'end']]
排序条件为:
如果 p1[0] == p2[0] 和 p1[2] == 'start' 和 p2[2] == 'start',则 p1[1] 或 p2[1] 更大价值应该是第一位的。
如果 p1[0] == p2[0] 和 p1[2] == 'end' 和 p2[2] == 'end',则 p1[1] 或 p2[1] 具有较小的价值应该是第一位的。
如果 p1[0] == p2[0] 和 p1[2] == 'start' 和 p2[2] == 'end',那么带有 'start' 的点应该在前。
我尝试编写一个自定义比较器(得到正确答案),只是想知道这是正确的方法吗?能不能简单点?
def mycmp(p1, p2):
if p1[0] < p2[0]:
return -1
if p1[0] == p2[0]:
if p1[2] == 'start' and p2[2] == 'start' and p1[1] > p2[1]:
return -1
elif p1[2] == 'end' and p2[2] == 'end' and p1[1] < p2[1]:
return -1
elif p1[2] == 'start' and p2[2] == 'end':
return -1
return 0
points.sort(key=cmp_to_key(mycmp))
【问题讨论】:
-
这个函数永远不会返回
1?这似乎不太适合排序回调。
标签: python-3.x list sorting comparator