python-3.x - 根据多个条件对元组列表进行排序
问题描述
给定一个元组列表 [(x, y, z), ....., (x_n, y_n,z_n)], x, y 是非负数并且 z 是 0 或 1,我想对列表进行排序基于以下三个标准——
- 如果 x_i != x_j,按 x(tuple[0]) 的升序排序
- 如果 x_i == x_j 和 z_i != z_j,则按 z(tuple[2]) 的升序排序
- 如果 x_i == x_j 和 z_i == z_j 和 z_i == 0,则按 y(tuple[1]) 的降序排序
- 如果 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)
任何人都可以建议,在这种情况下,关键论点的价值应该是什么?谢谢
解决方案
如果你有非常复杂的排序规则,你可以写一个比较器函数,然后用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__
在每次比较中执行比较器的工作。
推荐阅读
- python - 超过maxsize时如何在日志文件夹中创建多个日志文件
- maven - 在 jetty 中部署 RAP .war 文件
- c# - 如何使用实体框架c#显示三个表的值与表中关联的外键?
- javascript - 仅在谷歌浏览器中删除 Summernote 中的字符时出错
- react-native - 如何在 react-native-mapbox-gl 中实现可拖动标记?
- c++ - 绘制简单多边形时出现 Qt C++ 错误
- mariadb - 在 MariaDB 10.3 中允许对特定用户进行外部访问
- java - kafkaProducer第一次尝试发送记录时无法创建主题INVALID_REPLICATION_FACTOR
- java - 由于快照依赖关系(?),Gradle 同步失败(Android Studio)
- json - 以角度显示 json 数据(使用打字稿)