下面是一个使用total_ordering
一个class
和__eq__
定义和__lt__
可排序:
from functools import total_ordering
@total_ordering
class Score():
def __init__(self, country, wins, draws, losses, goals_for, goals_against):
self.country = country
self.wins = wins
self.draws = draws
self.losses = losses
self.goals_for = goals_for
self.goals_against = goals_against
def _value(self):
return self.wins * 3 + self.draws, self.goals_for - self.goals_against
def __eq__(self, other):
return self._value() == other._value()
def __lt__(self, other):
return self._value() < other._value()
Honduras = Score('Honduras',3, 4, 3, 13, 19)
Mexico = Score('Mexico', 6, 3, 1, 16, 7)
CostaRica = Score('Costa Rica', 4, 4, 2, 14, 8)
TrinidadAndTobago = Score('Trinidad And Tobago', 2, 0, 8, 7, 19)
USA = Score('USA', 3, 3, 4, 17, 13)
Panama = Score('Panama', 3, 4, 3, 9, 10)
scores = sorted([Honduras, Mexico, CostaRica, TrinidadAndTobago, USA, Panama], reverse=True)
print([score.country for score in scores])
# Output: ['Mexico', 'Costa Rica', 'Panama', 'Honduras', 'USA', 'Trinidad And Tobago']
UPDATE
下面是另一个选项,这次使用sort
中的namedtuple
和key
函数。 (这样可以使排序逻辑之类的外部。根据你在做什么,这可能是好还是坏。)
from collections import namedtuple
Score = namedtuple('Score',
['country', 'wins', 'draws', 'losses', 'goals_for', 'goals_against'])
Honduras = Score('Honduras',3, 4, 3, 13, 19)
Mexico = Score('Mexico', 6, 3, 1, 16, 7)
CostaRica = Score('Costa Rica', 4, 4, 2, 14, 8)
TrinidadAndTobago = Score('Trinidad And Tobago', 2, 0, 8, 7, 19)
USA = Score('USA', 3, 3, 4, 17, 13)
Panama = Score('Panama', 3, 4, 3, 9, 10)
scores = sorted([Honduras, Mexico, CostaRica, TrinidadAndTobago, USA, Panama],
key=lambda s: (s.wins * 3 + s.draws, s.goals_for - s.goals_against),
reverse=True)
print([score.country for score in scores])
# Output: ['Mexico', 'Costa Rica', 'Panama', 'Honduras', 'USA', 'Trinidad And Tobago']
你期望你的输出是和你想说什么? –
不是通过构造一个将它转换为字符串的函数,而是通过构造一个类并实现丰富的比较。但是这个问题表明(接近)零解决问题的努力。 –
@WillemVanOnsem感谢您的贡献 –