此问题在此处已有答案:
How to sort a list with two keys but one in reverse order?(8个答案)
8小时前关门了。
在Python 3中,sort()
有参数key
和reverse
。如果你使用一个自定义的比较函数,并且它对多个项排序(每个对象),你如何单独地对每个项进行升序或降序?在我的例子中,项不是数字,所以否定一个值不是一个选项。
我没有找到任何语法方法来做我想做的事情,所以我卡住了。在Python 2中,你可以很容易地做到这一点,因为比较函数返回-1
,0
,+1
。Python 3似乎不太灵活。
2条答案
按热度按时间jtjikinw1#
可以使用
functools.cmp_to_key()
函数:将旧式比较函数转换为键函数。用于接受键函数的工具(如
sorted()
、min()
、max()
、heapq.nlargest()
、heapq.nsmallest()
、itertools.groupby()
)。此函数主要用作从支持使用比较函数的Python 2转换而来的程序的转换工具。也就是说,您可以转换以下Python 2代码:
转换为Python 3,如下所示
flseospp2#
更新:这不是一个好的方法。我不会删除答案,因为评论中的讨论很有价值。
重要提示:只有在可以修改要比较的对象的定义时,这种方法才适用。
如果你有访问对象定义的权限并且允许修改它,你可以覆盖对象中的dunder方法
__lt__
来规定如何进行比较。因为你设置了比较规则,所以你可以按照你想要的方式排序,而不必为排序函数提供key
。示例
解释
Foo
的示例首先按a
升序排序。如果a
(整数)相同,则按b
(字符串)降序排序。此逻辑在__lt__
方法中表示。