首页 > 解决方案 > 如何根据python中的两个条件对数组进行排序

问题描述

我有以下数组:

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

如何根据元素的第一个值以及第二个元素是否等于 1 对数组进行排序。我尝试了以下方法,

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

但我得到了这个结果:

[[10, 0], [5, 0], [5, 1], [2, 1], [1, 1], [8, 1]]

标签: pythonsorting

解决方案


x[0] and x[1] == 1

这是一个逻辑表达式,其计算结果要么为 True(如果 x[0] != 0 且 x[1] == 1),要么为 False。所以你的排序键只能取两个可能的值。

据我了解,您想要的是:

  • 在所有情况x[1] == 1之后出现的所有情况x[1] != 1
  • 受上述限制,输出按x[0]

你不能用一维键轻易做到这一点。要了解原因,请考虑介于 和 之间的可能输入范围以及介于和[-Inf,0]之间[Inf,0]的范围。[-Inf,1][Inf,1]

这些范围中的每一个在两个方向上都是无限大的。如果你想用一维键对它们进行排序,你需要以某种方式将两个双端无限范围映射到一个数轴上。

这不是不可能的——如果你真的必须这样做,你可以使用一些技巧来实现它。但这是解决问题的一种非常迂回的方式。

使用二维键要容易得多。sort 函数首先检查元组的第零个位置,并且仅作为决胜局进入第一个位置。因此,因为 的值x[1]在您想要的排序顺序中具有优先级,所以元组的第零个条目基于,第一个条目x[1]基于x[0],如下所示:

x=[[8, 1], [1, 1], [3, 1], [8, 1], [4, 0], [2, 0]]
sorted(x,key=lambda x:(x[1]==1,x[0]))

输出:

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

推荐阅读