按不同的顺序排序对象属性

时间:2016-10-05 13:51:27

标签: python python-3.x sorting

我正在写一个足球联赛计划,我想在打印之前对桌子进行排序。每个团队都是具有某些属性的类的成员,到目前为止,我已经能够正确地对整数属性进行排序。

for team in sorted(teams, key=attrgetter("points", "goalDiff", "scored", "name"), reverse = True):

我希望除了name之外的所有属性都可以反转,是否有可能在这行代码中“取消反转”name属性,或者我必须采用不同的方法接近?

1 个答案:

答案 0 :(得分:6)

如果所有属性(名称除外)都是数字,则取消这些数字以获得相反的排序:

sorted(teams, key=lambda t: (-t.points, -t.goalDiff, -t.scored, t.name))

否定数字为您提供了一种方法来反转其排序顺序,而无需实际反转排序。

如果情况并非如此,那么您必须排序两次,首先是name属性(按正向顺序),然​​后是其他属性的相反顺序。对于pointsgoalDiffscored相等的任何对象,保留原始排序顺序(按名称),因为Python使用的排序算法是稳定的:

sorted(
    sorted(teams,  key=attrgetter('name')),
    key=attrgetter("points", "goalDiff", "scored"),
    reverse=True)