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)中。虽然该术语使用“逗号”一词,但该格式实际上仅表示任何类型的一致字段分隔符,每条记录位于一行。

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 回答