首页 > 解决方案 > 根据多个条件对元组列表进行排序

问题描述

给定一个元组列表 [(x, y, z), ....., (x_n, y_n,z_n)], x, y 是非负数并且 z 是 0 或 1,我想对列表进行排序基于以下三个标准——

  1. 如果 x_i != x_j,按 x(tuple[0]) 的升序排序
  2. 如果 x_i == x_j 和 z_i != z_j,则按 z(tuple[2]) 的升序排序
  3. 如果 x_i == x_j 和 z_i == z_j 和 z_i == 0,则按 y(tuple[1]) 的降序排序
  4. 如果 x_i == x_j 和 z_i == z_j 和 z_i == 1,则按 y(tuple[1]) 的升序排序
Input: [(1, 1, 0), (2, 1, 1), (1, 2, 0), (2, 2, 1), (1, 3, 0), (2, 3, 1)]
output:[(1, 3, 0), (1, 2, 0), (1, 1, 0), (2, 1, 1), (2, 2, 1), (2, 3, 1)]

由于 Python 3 不支持我对 JAVA 所知道的排序的自定义比较器功能,因此我不知道如何将上述三个条件合并到排序方法中。

我可以根据上述标准的两个标准(1,2或1,3)进行排序。添加第三个条件会使 2 或 3 之一无效。我在这里添加我的代码-

points.sort(key=lambda p: p[2])        
points.sort(key=lambda p: p[1], reverse=True)
points.sort(key=lambda p: p[0])
OUTPUT: [(1, 3, 0), (1, 2, 0), (1, 1, 0), (2, 3, 1), (2, 2, 1), (2, 1, 1)] (criteria 3 not satisfied)

任何人都可以建议,在这种情况下,关键论点的价值应该是什么?谢谢

标签: python-3.xsorting

解决方案


如果你有非常复杂的排序规则,你可以写一个比较器函数,然后functools.cmp_to_key它来使它成为一个有效的key参数。所以编写你疯狂的比较器函数,添加from functools import cmp_to_key到文件的顶部,然后执行:

points.sort(key=cmp_to_key(my_insane_comparator))

它会按预期工作。真正要做cmp_to_key的就是创建一个带有自定义__lt__(小于运算符)的自定义类,该类__lt__在每次比较中执行比较器的工作。


推荐阅读