2017-10-12 3 views
-2

Après les récents qualificatifs de la FIFA, j'ai décidé de faire un classement trié en fonction des résultats de qualification d'un pays. C'est déjà posté mais je voulais essayer d'en faire un.Liste de tri basée sur un élément de fonction simple/couple

J'ai fait la fonction suivante, les éléments et la liste:

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] 

Dans FIFA, une équipe est classé au premier rang par des points, puis par la différence de but s'il y a un lien avec des points. Comment puis-je trier ma liste de pays sur la base de ces paramètres, en accédant aux résultats d'un pays à travers la fonction?

résultats attendus sont: 1) Mexique 2) Costa Rica 3) Panama 4) Honduras 5) États-Unis 6) Trinité-et-Tobago

+0

Qu'attendez-vous de votre sortie pour être et ce que vous obtenez? –

+0

bien non pas en construisant une fonction qui le convertit en une chaîne, mais en construisant une classe et en mettant en œuvre des comparaisons riches. Mais cette question montre (près de) aucun effort pour résoudre le problème. –

+0

@WillemVanOnsem Merci pour la contribution –

Répondre

1

Voici un class qui utilise total_ordering et une définition de __eq__ et __lt__ à triables:

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

MISE à JOUR

Voici une autre option, cette fois avec namedtuple et une fonction key dans le sort. (Cela permet de maintenir la logique de tri en dehors de la classe. En fonction de ce que vous faites, qui pourrait être meilleur ou pire.)

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