使用不同的顺序按多个键排序

Cha*_*l72 45 python python-3.x

可能重复:
如何为降序值编写Python排序键函数

在Python 3中,使用多个键按字典顺序对对象列表进行排序非常容易.例如:

items.sort(key = lambda obj: obj.firstname, obj.lastname)

reverse参数允许您指定是要升序还是降序.但是,如果您想要按多个键排序,但是您想使用第一个键的降序排序,以及第二个键的升序排序,您会怎么做?

例如,假设我们有两个属性的对象,points并且name,在这里points是一个intname是一个str.我们希望通过梳理这些对象的名单points递减顺序(使之与点的数量最多的对象是第一位的),但与同等数量的对象points,我们希望通过梳理这些name字母(升序)的顺序.

怎么能实现这一目标?

Bre*_*arn 31

没有内置的方法来处理这个问题.对于一般情况,您必须排序两次:首先是二级排序,然后是主排序.正如@Mark Ransom在他的评论中提到的,在许多情况下变量是数字的,因此您可以使用负值来翻转排序.

如果您知道要尝试排序的变量的类型以及如何使用它,您还可以编写一个键函数,该函数返回递增键的递减值.有关字符串的示例,请参阅此主题.(基本上,你取字符的ASCII数值的负数.)

在Python 2中,您还可以使用cmp函数而不是键,但这可能会使排序变慢.是否会使它太慢取决于列表的大小和未分类.在Python 3中,cmp论证已经消失,但正如@Mark Ransom所说,你可以使用cmp_to_key.


Mar*_*Wit 13

items.sort(key = lambda obj: (obj.firstname, [(-ord(c) for c in obj.lastname)]))
Run Code Online (Sandbox Code Playgroud)


Mar*_*som 6

functools.cmp_to_key一个比较函数转换成一个键兼容的排序功能.这是为在Python 2中使用比较函数的类别提供的,需要转换为不再允许它们的Python 3.

编辑:Python维基中的一个建议是在排序稳定性和复杂排序标题下进行多次传递的排序,从最不重要的密钥到最重要的密钥.这是有效的,因为Python的排序保证是稳定的,因此在遇到等效键时会保留先前的顺序.