很容易实现常规的双重排序:
pairs = [(1, 2), (2, 1), (1, 3), (2, 4), (3, 1)]
sorted(pairs,key=lambda x: (x[0],x[1]))
# out: [(1, 2), (1, 3), (2, 1), (2, 4), (3, 1)]
我感兴趣的是如何以相反的顺序使用第二个元素。这可以通过首先将对由第一项分组然后将已排序的第二项添加到一起来容易地实现。我已使用itertools.groupby
和defaultdict
实现了此功能。尽管如此,它仍然比常规的双重排序复杂得多,所以我想知道,如果有一个巧妙的技巧可以用更简洁的方式来做到这一点。
double_sort(pairs)
# out: [(1, 3), (1, 2), (2, 4), (2, 1), (3, 1)]
PS!我知道如何使用numpy.argsort
进行操作,并且最希望看到标准的lib方法。
答案 0 :(得分:4)
这适用于数字和类似数据类型
sorted(pairs, key=lambda x: (x[0], -x[1]))
这仅适用于Python 2中的所有类似类型:(
sorted(pairs, lambda x, y: cmp(x[0], y[0]) or cmp(y[1], x[1]))