0

我对 python 很陌生,我希望我没有错过其他地方的修复。我有一个简单的程序,它是我购买的书中的练习之一,但我遇到了一个问题。我有一个程序可以打开文件并将其写入列表。然后用户可以使用输入更新列表,当用户退出时,它会使用最新内容更新列表。除排序选项外,一切正常。它显示文件中的分数,前面有一个单引号,并且在程序没有运行时更新分数。它也根本不对它们进行排序。我尝试了许多不同的方法来做到这一点。我确信从长远来看这并不重要,但我想弄清楚。

这是代码

# 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)将按相反的顺序排序,而不必遍历列表两次。
  • 这通常是一个坏主意except::这绝对会捕获程序的任何问题,包括用户点击^C尝试退出,系统内存不足等。你应该except Exception:作为一个包罗万象的方法来获取它的异常当您只想处理某些类型时,可以从那些类型的系统错误或更具体的异常中恢复,但不能恢复。
于 2012-04-24T16:46:08.557 回答
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 回答