0

宿題を手伝っていただければ幸いです - ファイルが存在するかどうかをチェックすることになっているクラス用の単純なプログラムです。ファイルが存在する場合、ファイルを読み取り、データをプログラムにロードするため、スコアを一覧表示して追加できますそれらの多く。上位5 つのスコアのみを保持することになっています。

次に、(オプション 0 を選択して) プログラムを閉じると、上位 5 つのスコアがscores.txtファイルに書き込まれます。scoresプログラムがファイルを正しく読み取って入力するのに問題があります。

これまでの私のコードは次のとおりです。

scores = []

#Check to see if the file exists
try:
    file = open("scores.txt")
    for i in range(0, 5):
        name = file.readline()
        score = file.readline()
        entry = (score, name)
        scores.append(entry)
        scores.sort()
        scores.reverse()
        scores = scores[:5]
    file.close()
except IOError:
    print "Sorry could not open file, please check path."


choice = None
while choice != "0":

    print    """
    High Scores 2.0

    0 - Quit
    1 - List Scores
    2 - Add a Score
    """


    choice = raw_input("Choice: ")
    print ""

    # exit
    if choice == "0":
        print "Good-bye."
        file = open("scores.txt", "w+")
        #I kinda sorta get this now... kinda...
        for entry in scores:
            score, name = entry
            file.write(name)
            file.write('\n')
            file.write(str(score))
            file.write('\n')
        file.close()

    # display high-score table
    elif choice == "1":
        print "High Scores\n" 
        print "NAME\tSCORE" 
        for entry in scores:
            score, name = entry    
            print name, "\t", score

    # add a score
    elif choice == "2":
        name = raw_input("What is the player's name?: ")
        score = int(raw_input("What score did the player get?: "))
        entry = (score, name)
        scores.append(entry)
        scores.sort()
        scores.reverse()
        scores = scores[:5]     # keep only top 5 scores

    # some unknown choice
    else:
        print "Sorry, but", choice, "isn't a valid choice." 

raw_input("\n\nPress the enter key to exit.")
4

1 に答える 1

1

カンマ区切り値(CSV)でファイルを書き込んでみてください。この用語は「コンマ」という単語を使用しますが、この形式は実際には、各レコードが1行にある、あらゆるタイプの一貫したフィールド区切り文字を意味します。

Pythonには、この形式の読み取りと書き込みを支援するcsvモジュールがあります。しかし、私はそれを無視して、宿題の目的で手動で行います。

次のようなファイルがあるとしましょう。

Bob,100
Jane,500
Jerry,10
Bill,5
James,5000
Sara,250

ここではカンマを使用しています。

f = open("scores.txt", "r")
scores = []
for line in f:
    line = line.strip()
    if not line:
        continue
    name, score = line.strip().split(",")
    scores.append((name.strip(), int(score.strip())))

print scores
"""
[('Bob', 100),
 ('Jane', 500),
 ('Jerry', 10),
 ('Bill', 5),
 ('James', 5000),
 ('Sara', 250)]
"""

読んで追加するたびにリストを並べ替える必要はありません。あなたは最後に一度それをすることができます:

scores.sort(reverse=True, key=lambda item: item[1])
top5 = scores[:5]

lambdaはあなたにとって新しいかもしれないことを理解しています。これは無名関数です。ここでは、これを使用して、比較用のキーを見つける場所を並べ替え関数に指示します。この場合、スコアリストの各項目について、スコアフィールド(インデックス1)を使用して比較します。

于 2012-11-24T18:08:40.280 に答える