2017-10-12 10 views
-2

最近のFIFAの予選では、国の予選結果に基づいてソートされたランキングを作ることにしました。これは既に掲載されていますが、私は1つを作りたいと思っていました。シングル/カップルのアイテムに基づいてリストをソートする

私は、次の機能、要素およびリストを作った: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] 

、ポイントとのタイがある場合、チームは最初の得失点差により、その後のポイントでランク付けされます。どのようにして、これらのパラメータに基づいて国のリストをソートし、その機能を通じて国の結果に到達する必要がありますか?

期待される結果は以下のとおりです。 1)メキシコ 2)コスタリカ 3)パナマ 4)ホンジュラス 5)USA 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

namedtuplekeyという別のオプションがあります。これはsortの機能です。 (これは、クラスの外でソートロジックを保持します。あなたがやっていることによって、良くも悪くもなるかもしれない。)

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'] 
関連する問題