1

外部ファイルの内容は次のようになります。

Ricky, 12
Sachin, 45
Brian, 2
Monty, 1

私が基本的にやりたいのは、これをPythonで読み取って注文できるようにすることです。これにより、スコアが一番下になり、スコアが一番高くなります。

これまでに入手したコードは次のとおりです。

def SaveTopScores():
  return HiScores.rsplit('(',1)[1]

  with open("HiScores.txt", "r")as file:
    HiScoreslist = HiScores.read().splitlines()

  HiScoreslist.sort()

  HiScoreslist.sort(key=HiScore)

  for HiScore in HiScoreslist:
    print(HiScore)

私はまだPythonの初心者であり、本当に助けが必要です。私が間違っているところを訂正し、私が完全に間違っているかどうかを教えてください。もしそうなら、問題を解決するための最善の方法は何ですか?

4

3 に答える 3

2

いくつかのリスト内包表記:

with open("HiScores.txt") as hiscores:
    scores = [line.split(',') for line in hiscores if line.strip()]
scores = [(name.strip(), int(score)) for name, score in scores]
scores.sort(key=lambda s: s[1], reversed=True)

for name, score in scores:
    print('{:<20} {:>10}'.format(name, score))

これ:

  1. ファイルをコンテキストマネージャー()として開くwith ... as ...ため、自動的に閉じられます
  2. 各行を分割するファイルをループします(行が空でない場合)
  3. ファイル内の各2値エントリをストリップされた文字列と整数に変換します
  4. 各タプルの2番目の値(スコア)でファイルを並べ替え、結果を逆にします(最初に最高のスコア)
  5. フォーマットされた各エントリを印刷します(各名前を20文字の領域で左に揃え、各スコアを10文字のフィールドで右に揃えます)。
于 2013-03-04T12:04:12.913 に答える
1

だから、このように?

def scores(fn):

    data = []
    with open(fn) as f:
        for ln in f:
            name, score = ln.strip().split(',')
            data.append((int(score.strip()), name))

    for score, name in sorted(data, reversed=True):
        print name, score
于 2013-03-04T12:03:35.417 に答える
0

元のコードをあまり変更しなくても、これは機能するはずです。説明が必要な部分があれば教えてください。

with open("HiScores.txt", "r") as fin:
    HiScores = fin.read().splitlines()

HiScoresList = []

for score in HiScores:
    name, score = score.split(', ')
    score = int(score.strip())
    HiScoresList.append((name, score))

# Look at two score entries, and compare which score is larger
def BestScore(a, b):
   return cmp(b[1], a[1])

HiScoresList.sort(BestScore)

for HiScore in HiScoresList:
    print(HiScore)

プリント:

('Sachin', 45)
('Ricky', 12)
('Brian', 2)
('Monty', 1)
于 2013-03-04T12:12:07.363 に答える