2017-10-12 57 views
-2

在最近的FIFA限定词之后,我决定根据国家的限定词结果进行排序排序。这已经发布,但我想尝试制作一个。基于单个/情侣功能项目的排序列表

我做了以下功能,要素和列表:

def Scores(Country, wins, draws, losses, goalsfor, goalsagainst): 
    points = (wins *3)+ draws 
    goaldifference = goalsfor - goalsagainst 
    return '{} has {} wins, {} draws, {} losses, {} goal difference, {} points'.format(Country, wins, draws, losses, goaldifference, points) 

Honduras = Scores('Honduras',3, 4, 3, 13, 19) 
Mexico = Scores('Mexico', 6, 3, 1, 16, 7) 
CostaRica = Scores('Costa Rica', 4, 4, 2, 14, 8) 
TrinidadAndTobago = Scores('Trinidad And Tobago', 2, 0, 8, 7, 19) 
USA = Scores('USA', 3, 3, 4, 17, 13) 
Panama = Scores('Panama', 3, 4, 3, 9, 10) 

Teams = [Honduras, Mexico, CostaRica, TrinidadAndTobago, USA, Panama] 

在FIFA,一队首先由分排名,然后通过净胜球如果没有与点领带。如何根据这些参数对我的国家列表进行排序,通过函数来​​达到国家的结果?

预期结果是: 1)墨西哥 2)哥斯达黎加 3)巴拿马 4)洪都拉斯 5)美国 6)特立尼达和多巴哥

+0

你期望你的输出是和你想说什么? –

+0

不是通过构造一个将它转换为字符串的函数,而是通过构造一个类并实现丰富的比较。但是这个问题表明(接近)零解决问题的努力。 –

+0

@WillemVanOnsem感谢您的贡献 –

回答

1

下面是一个使用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中的namedtuplekey函数。 (这样可以使排序逻辑之类的外部。根据你在做什么,这可能是好还是坏。)

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']