2013-01-12 72 views
3

这是很容易实现正则双排序:双排序与反向

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.groupbydefaultdict来实现这一点。尽管如此,它仍然比普通的双重排序复杂得多,所以我想知道,是否有一个简洁的方法可以用更简洁的方式来完成。

double_sort(pairs) 
# out: [(1, 3), (1, 2), (2, 4), (2, 1), (3, 1)] 

PS!我知道如何做到这一点,numpy.argsort,主要是想看到一个标准的库方法。

+1

你拉姆达什么都不做。携手'整理(双)已经给出了和你第一次相同的结果。 –

回答

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])) 
+0

+1,在看到类似的东西之后,感觉非常愚蠢:) – root