0

私はPythonに非常に慣れていないので、他の場所でこれの修正を見逃さなかったことを願っています。購入した本の練習問題の 1 つである簡単なプログラムを持っていますが、問題が発生しています。ファイルを開いてリストに書き込むプログラムがあります。次に、ユーザーは入力でリストを更新できます。ユーザーが終了すると、最新のコンテンツでリストが更新されます。並べ替えオプションを除いて、すべて正常に機能します。ファイルからのスコアが一重引用符で囲まれて表示され、スコアはプログラムが実行されていないときに更新されます。また、それらをまったくソートしません。これを確実に行うために、さまざまな方法を試しました。これは長期的にはそれほど重要ではないと確信していますが、私はそれを理解したかったのです.

ここにコードがあります

# High Scores
# Demonstrates list methods

scores = []
try:
    text_file = open("scores.txt", "r")
    for line in text_file:
        scores.append(line.rstrip("\n"))

    text_file.close()

except:
    raw_input("Please verify that scores.txt is placed in the correct location and run again")



choice = None
while choice != "0":


    print \
    """
    High Scores Keeper

    0 - Exit
    1 - Show Scores 
    2 - Add a Score
    3 - Delete a Score 
    4 - Sort Scores
    """

    choice = raw_input("Choice: ")
    print

    # exit
    if choice == "0":
        try:
            output_file = open("scores.txt" , "w")
            for i in scores:
                output_file.write(str(i))
                output_file.write("\n")

            output_file.close()
            print "Good-bye"
        except:
            print "Good-bye.error"

    # list high-score table
    elif choice == "1":
        print "High Scores"
        for score in scores:
            print score

    # add a score
    elif choice == "2":
        score = int(raw_input("What score did you get?: "))
        scores.append(score)

    # delete a score
    elif choice == "3":
        score = int(raw_input("Delete which score?: "))
        if score in scores:
            scores.remove(score)
        else:
            print score, "isn't in the high scores list."

    # sort scores
    elif choice == "4":
        scores.sort()
        scores.reverse()
        print scores

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


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

2 に答える 2

5

ファイルからスコアを追加すると、それらは文字列として追加されます: scores.append(line.rstrip("\n")). しかし、プログラム中にスコアを追加するときは、それらを整数として追加しています: int(raw_input("What score did you get?: ")).

Python が文字列と整数の両方を含むリストをソートする場合、文字列を文字の順序 ( so '1' < '12' < '3') に従ってソートし、整数を個別にソートして、整数を文字列の前に置きます。

>>> sorted([1, 8, '11', '3', '8'])
[1, 8, '11', '3', '8']

おそらく、ここで行っているように、文字の前後に一重引用符を出力しています(文字列であることを示しています)。

したがって、最初にファイルを読み取るときは、ユーザー入力を読み取るときと同じように、それらを整数に変換します。


その他のヒント:

  • scores.sort(reverse=True)リストを 2 回調べなくても、逆順にソートされます。
  • これは一般的に悪い考えですexcept:: これは、ユーザー^Cが終了しようとしたり、システムがメモリ不足になったりするなど、プログラムに関するあらゆる問題を完全にキャッチしexcept Exception:ます。これらの種類のシステムエラー、または特定のタイプのみを処理したい場合のより具体的な例外から回復することはできません。
于 2012-04-24T16:46:08.557 に答える
1

テキスト ファイルに 1 行に 1 つのスコアしかない場合、このような入力を取得しながらスコアを整数に変更するのが最善の方法です。

scores = []
try:
    text_file = open("scores.txt", "r")
    for line in text_file:
        scores.append(int(line.strip()))
except:
    text_file.close()

実際、入力を取得する方法は、数値の一部を文字列として残すことです。この種の問題に対処する最善の方法は、ソートする前に配列を印刷して調べることです。ではごきげんよう。

于 2012-04-24T16:56:13.237 に答える