我有以下数组:
[[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]]
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]
。
这些范围中的每个在两个方向上都无限大。如果要使用一维键对它们进行排序,则需要以某种方式将两个双端无限范围映射到一条数字线上。
这并非不可能-如果您确实必须那样做,可以使用一些技巧来实现这一目标。但这是解决问题的一种非常round回的方法。
仅使用二维键会容易得多。排序功能首先检查一个元组的第零个位置,并且仅在决胜局中转到第一个位置。因此,因为值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]]
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句