Python将两个键排序为两个订单

时间:2016-08-27 02:36:39

标签: python python-3.x sorting

在这种情况下,我有一个列表:

[(1,a),(1,b),(5,c)]

我想对列表进行排序,使其首先依赖于降序编号,然后按升序排列字符。

我试过了:

sorted(theList, key = lambda x:(x[0], x[1]), reverse = True)

但是结果按键中的降序排序。显然,反向只取一个变量 我搜索了网络,无法找到解决方案。请帮忙!谢谢!

2 个答案:

答案 0 :(得分:3)

根据Python文档:

  

内置的sorted()函数保证稳定。如果排序保证不更改比较相等的元素的相对顺序,则排序是稳定的 - 这有助于在多个过程中进行排序(例如,按部门排序,然后按工资等级排序)。

因此,一种简单的方法是进行两遍排序:

sorted(theList, key = lambda x:x[1])
sorted(theList, key = lambda x:x[0], reverse = True)

或者,如果你真的想要一个单行,你可以这样做:

sorted(thisList, key = lambda x:x[0] * 26 - (ord(x[1]) - ord('a')), reverse = True)

这个单行假设所有字符都是小写的。它的作用是使每两个连续的数字具有26而不是1的步长,并且字符a-z被映射到0-25,作为更精细的步骤。由于字符是升序,我们从缩放的数字值中减去它。

这个单行是一种黑客行为,因为如果x[1]没有范围(即也是一个数字),它就行不通了

答案 1 :(得分:3)

如果元组中的第一个元素是整数,则可以按其负值排序:

sorted(theList, key=lambda (num, letter): (-num, letter))