2015-12-16 73 views
-2

我有一段代码(见下文),它使我能够问学生一系列随机问题,然后将他们的名字和分数保存到一个文件中。我把名字和分数合并成一个名为info的变量,名字首先是分数。我现在需要按照评分顺序对这些信息进行分类。是否有一种方法让我在整个文件中暂时将分数放在名称的前面,以便我可以使用已排序的函数使其从最低到最高?重新排列文件

任何帮助将不胜感激!谢谢。

import random 
import time 

Name=input("What is your name?") 
Class=input("Are you in Class A, B or C?") 
print("Welcome" ,Name, "to the Maths Quiz!!") 
time.sleep(3) 
QuestionNumber=0 
Operations=["+","-","x"] 
answer=0 
score=0 
while QuestionNumber < 10: 
     Num1=random.randint(1,12) 
     Num2=random.randint(1,12) 
     QuestionNumber=QuestionNumber+1 
     operation = random.choice(Operations) 
     print("What is", Num1 ,operation, Num2) 
     guess=int(input("What is the answer to this question?")) 

     if operation =="+": 
      answer=Num1+Num2 

     elif operation =="-": 
       answer=Num1-Num2 

     elif operation =="x": 
      answer=Num1*Num2 

     if guess==answer: 
      score=score+1 
      print ("Correct") 
     else: 
      print("Incorrect") 

print("Well done You got", score, "Out of 10!!") 
score=str((score)) 
Info= (Name + (" ") + score) 
if Class=="A": 
     ClassA=open("Class A Results.txt","a") 
     ClassA.write(Info) 
     ClassA.write(" \n") 
     ClassA.close() 
elif Class=="B": 
     ClassB=open("Class B Results.txt","a") 
     ClassB.write(Info) 
     ClassB.write(" \n") 
     ClassB.close() 
elif Class=="C": 
     ClassC=open("Class C Results.txt","a") 
     ClassC.write(" \n") 
     ClassC.write(Info) 
     ClassC.close() 

Viewscores=input("Do you want to see previous scores? Y/N") 

if Viewscores=="Y": 
     Classresults=input("Which Class would you like to see the results of?") 
else: 
     print ("Thank you for using the maths quiz, press enter to close the program in 10 seconds") 
     time.sleep(10) 
     closeprogram=input("Hit enter") 
if Classresults=="A": 
     ClassA=open("Class A Results.txt","r") 
     Class=Class 
     alphabet=ClassA.readlines() 
     for line in sorted(alphabet): 
       print(line) 
elif Classresults=="B": 
     ClassB=open("Class B Results.txt","r") 
     Class=ClassB 
     alphabet=ClassB.readlines() 
     for line in sorted(alphabet): 
       print(line) 
elif Classresults=="C": 
     ClassC=open("Class C Results.txt","r") 
     Class=ClassC 
     alphabet=ClassC.readlines() 
     for line in sorted(alphabet): 
       print(line) 
else: 
     print ("That is not valid") 
+1

阅读https://wiki.python.org/moin/HowTo/Sorting#Key_Functions –

+1

另外,不要将变量命名为'Class'(它非常接近内置的'class'关键字,并避免通用变量名称,比如'Name' - 类似'pupil_name'会更好。 –

回答

1

sortedkey功能可以为你做到这一点,但它更漂亮,如果您还没有它们合并成一个单一的字符串,但存储tuple S中的对吧。使用operator.itemgetter很好地概括。而不是存储的:

score = str(score) 
Info = Name + " " + score 

店:

Info = (Name, score) # Score remains a float 

然后,当你需要进行排序,这样做:

# Imports at top of file, not each sort 
from operator import itemgetter 

... 

for name, score in sorted(myunorderedinfo, key=itemgetter(1, 0)): 

在您所提供的代码,你写一个文件,回读(这将需要重新解析),所以你可能想看看csv模块以合适的格式存储对(简单的空间分离很容易搞砸);在这种情况下,你必须将输入转换回float,因为csv.reader传回list s的str,但这对于简单的生成器表达式(作为练习留下)来说相对容易。

0

顺便说一句,你可以使你的代码更整洁通过删除所有重复的代码:

VALID_CLASS_NAMES = {"A", "B", "C"} 

if Classresults not in VALID_CLASS_NAMES: 
    print("Invalid class results selection") 
    raise Exception("BOOM") 

filename = "Class {} Results.txt".format(Classresults) 
with open(filename, "r") as class_results_file: 
    alphabet=class_results_file.readlines() 
    for line in sorted(alphabet): 
     print(line) 

现在,如果你曾经添加类“d”,那么你只需要把它添加到该集合的有效类名称。