2017-01-14 7 views
0

5つの変数を含むクラスから作成されたキーを含む辞書があります。私は、クラスvarsの1つでこの辞書をソートしたい。クラス変数の1つで5変数を保持するクラスを含む辞書を並べ替える

def addplayer(players): 
    newName = input("\nEnter new Player name or 9 to quit: ") 
    wins = "0" 
    losses = "0" 
    ties = "0" 
    winpercent = "0" 
    if not newName: 
     print("\nNo name detected try again") 
     addplayer(players) 
    elif newName == '9': 
     print("\nReturning to Options menu") 
    else: 
     players[newName] = Player(newName,wins,losses,ties,winpercent) 
     saveData(players) 
     return players 

最終的に私は、ソートハイスコアリストに取り組んでいます:ここ

は、私は現在、私はこのようなプレーヤーが保存

class Player: 
    def __init__(self,name,wins,losses,ties,winpercent): 
     self.__name = name 
     self.__wins = wins 
     self.__losses = losses 
     self.__ties = ties 
     self.__winpercent = winpercent 

    # mutators 
    def setname(self,name): 
     self.__name = name 

    def setwins(self,wins): 
     self.__wins = wins 

    def setlosses(self,losses): 
     self.__losses = losses 

    def setties(self,ties): 
     self.__ties = ties 

    def setwinpercent(self,winpercent): 
     self.__winpercent = winpercent 
    # accessors 


    def getname(self): 
     return self.__name 

    def getwins(self): 
     return self.__wins 

    def getlosses(self): 
     return self.__losses 

    def getties(self): 
     return self.__ties 

    def getwinpercent(self): 
     return self.__winpercent 

    def displayHighScores(self): 
     print("\n"," "*2,self.__name," "*(24-len(self.__name)),self.__wins) 

    def displayplayers(self): 
     print(self.__name) 

を持っているものです。今すぐ次のように辞書を印刷することができます:

def printhiscores(players): 
    print("\n"," "*13,"HiScores") 
    print(" "*3,"Name"," "*20,"Wins") 
    if len(players) == 0: 
     print("\nNo current Players in memory.") 
    else: 
     for x in players.keys(): 
      players[x].displayHighScores() 

DisplayHighScores()はクラスオブジェクトの一部です。

は私が

OrderedDict(sorted(players.items(), key=itemgetter(1))) 

を使用してソート辞書に読んでてきたが、これは編集返します:例外TypeError:「を<は」「プレーヤー」

再び私は「プレイヤー」のインスタンスとの間でサポートされていません自分の勝利属性で選手の辞書を並べ替えて、この新しい注文をハイスコア画面に印刷することを考えています。どんな助けでも大歓迎です。私がこれ以上自分自身で進歩を遂げると、私は投稿します。

+0

ああ、今すぐ見つけました。だから、あなたは私の答えの後半に来る。将来的には、エラーの表示を切り換えて、質問の前提を変更しないでください。 –

+0

私はこのエラーを修正しようとする試みを実行し、間違った完全なエラーコードを投稿したことは、もっと問題でした。編集は私が修正しようとしていたエラーコードでした。ご協力いただきありがとうございます –

+0

これは私たちがあなた自身でテストする適切な[MCVE]を求める理由です。将来の投稿については、例外の完全なトレースバックも含めていただければ幸いです。 –

答えて

0

彼らは比較方法を実装していないとして、あなたのPlayerインスタンスが、しかし、注文可能ではありません。

TypeError: '<' not supported between instances of 'Player' and 'Player' 

あなたは値によってそれらを並べ替えたい場合は、たとえば、勝利を返され、その後、ちょうどその情報にアクセスだけではなく、値を返すの:あなたのPlayerクラスrich comparison methodsを与え、それ以外の場合は

OrderedDict(sorted(players.items(), key=lambda kv: kv[1].getwins())) 

を。あるインスタンスを別のインスタンスの前後でソートする必要があるかどうかを判断する方法。 equality testも必要です。上記

from functools import total_ordering 

@total_ordering 
class Player: 
    def __lt__(self, other): 
     if not isinstance(other, Player): 
      return NotImplemented 
     return self.__wins < other.__wins 

    def __eq__(self, other): 
     if not isinstance(other, Player): 
      return NotImplemented 
     return self.__wins == other.__wins 

彼らの勝利が等しいときに、2つのPlayerインスタンス等しくなり、その属性によってそれらを注文:それはちょうど休憩を提供するために、@functools.total_ordering decoratorを使用し、その後、<のサポート(その後、下げ)と平等を実装する方が簡単です。必要に応じてアプリケーションに合わせて調整する必要があります。

関連する問題