ここに辞書は絶対に必要ありません。辞書の要点は、ソートせずにキーを値にマップできることです。必要なのはソートされたリストです。そして、あなたはすでにそれを持っています。
タマスが指摘しているように、実際にはスコアではなく、プレーヤー名でソートされたリストがあります。その上、上向きではなく下向きに並べ替えます。装飾-並べ替え-装飾解除パターン、キー関数などを使用できますが、何かを行う必要があります。また、それをという名前の変数に入れましたがlist
、これはすでに型の名前であるため、非常に悪い考えlist
です。
とにかく、標準ライブラリのモジュールを使用して、ソートされたに何かを追加するかどうかlist
、および追加する場合はどこに挿入するかを確認できます。ただし、またはbisect
のようなものを使用する方がおそらく簡単です。SortedCollection
blist
次に例を示します。
highscores = SortedCollection(scores, key=lambda x: -x[3])
さて、ゲームを終了すると:
highscores.insert_right((player, a, b, newscore, time1))
del highscores[-1]
それでおしまい。実際にトップ10に入っていなかった場合は、#11に追加されてから、削除されます。トップ10に入っていた場合は追加され、古い#10は#11になり、削除されます。
古いアーケードゲームのように10個の偽のスコアをリストに事前入力したくない場合は、次のように変更します。
highscores.insert_right((player, a, b, newscore, time1))
del highscores[10:]
さて、すでに10点ある場合は、追加すると#11が削除されますが、3点しかない場合は何も削除されず、4点になります。
その間、なぜ新しいスコアをpickle
ファイルに書き込んでから同じものを読み戻すのかわかりません。リストにハイスコアを追加する前に読み取りを行い、その後に書き込みを行うことをお勧めします。それを追加します。
また、「リストを美しくする」方法についても質問しました。それには3つの側面があります。
まず第一に、コードで(player, a, b, c, time1)
は、あまり意味がありません。もちろん、変数に適切な名前を付けると役立ちますが、最終的には、リストにアクセスするときにentry[3]
、スコアentry[4]
を取得するか、時間を取得するために実行する必要があるという事実にたどり着きます。
これを解決するには、少なくとも3つの方法があります。
- sの代わりにsの
list
(またはSortedCollection
)を格納します。コードはもう少し冗長になりますが、はるかに読みやすくなります。を記述し、リストにアクセスするときに、の代わりに記述します。dict
tuple
{'player': player, 'height': a, 'weight': b, 'score': c, 'time': time1}
entry['score']
entry[3]
- のコレクションを使用し
namedtuple
ます。これで、実際に挿入するScoreEntry(player, a, b, c, time1)
か、挿入することができますScoreEntry(player=player, height=a, weight=b, score=c, time=time1)
。どちらかが特定の場合に読みやすく、どちらも同じように機能します。また、読みやすい方を使用して、entry.score
またはとしてアクセスできます。entry[3]
- スコアエントリの明示的なクラスを記述します。これは前のものと非常に似ていますが、記述するコードが多く、インデックス付きアクセスを実行できなくなりますが、プラス面として理解する必要はありません
namedtuple
。
第二に、あなたprint
がエントリだけの場合、それらは混乱のように見えます。これに対処する方法は、文字列のフォーマットです。の代わりにprint scores
、次のようにします。
print'\ n'.join( "{}:height {}、weight {}、score {} at {}"。format(entry)for entry in highscores)
だけでなくclass
またはを使用している場合は、位置ではなく名前でフォーマットすることもできるため、コードがはるかに読みやすくなります。namedtuple
tuple
最後に、ハイスコアファイル自体は、pickle
人間が消費するためのものではないため、読み取り不能な混乱です。人間が読める形式にする場合は、形式を選択し、その形式をシリアル化するコードを記述する必要があります。幸い、CSV形式は人間が読める形式であり、ほとんどのコードはcsv
モジュールで既に記述されています。(特にヘッダー行を記述したい場合は、クラスDictReader
とDictWriter
クラスを確認することをお勧めします。繰り返しになりますが、コードを少し増やして読みやすくするというトレードオフがあります。)