Python测试评分程序不是很有效但很接近

时间:2013-04-25 21:30:31

标签: python file for-loop while-loop

我正在开发一个打开文件'answer.txt'的程序。该文件模拟学生对测试的答案。然后,该程序将文件与answerKey进行比较。它逐行打印答案键和学生答案。它记录了好的和坏的答案。最后它会打印一个分数。我可以让这个程序与两个不同的答案键一起工作但是当我尝试从文件中提取答案时,我得到了太多的输出。它会跳过文件中的第一个答案。然后它从来回回答键中仅打印B,D。学生方从第二个答案开始打印,然后跳过其他所有答案。

我的代码:

def main():
    try:
        answerKey = ['B', 'D', 'A', 'A', 'C', 'A', 'B', 'A', 'C', 'D', 'B', 'C',\
                 'D', 'A', 'D', 'C', 'C', 'B', 'D', 'A']
        index = 0
        numCorrect = 0
        answer_file = open('answers.txt', 'r')

        studentExam = answer_file.readline()

        print('Correct\tYour\tStatus\nAns.\tAns.\n-----------------------\n')
        while studentExam != "":
            problem_number = index + 1
            studentExam = studentExam.rstrip("\n")

            studentExam = answer_file.readline()

            for answerLine, studentLine in zip (answerKey, studentExam):
                answer = answerLine.split()
                studentAnswer = studentLine.split()

                if studentAnswer != answer:
                    print( 'You got that question number', index + 1, 'wrong\n the correct answer was' ,answer, 'but you answered' , studentAnswer)
                    index += 1
                else:
                    numCorrect += 1
                    index += 1

        grade = int((numCorrect / 20) * 100)

        print (' The number of correctly answered questions: ', numCorrect)

        print (' The number of incorrectly answered questions: ', 20 - numCorrect)

        print (' Your grade is', grade, '%')

        if grade <= 75:
                    print (' You have not passed ')
        else:
                    print (' Congrats you have passed ')
    except IOError:
        print("The file could not be found")
    except IndexError:
        print("There was an indexing error")
    except:
        print("An error occurred")
main()

我的输出:

You got that question number 1 wrong
 the correct answer was ['B'] but you answered ['D']

You got that question number 2 wrong
the correct  answer was ['D'] but you answered []

You got that question number 3 wrong
 the correct answer was ['B'] but you answered ['A']

You got that question number 4 wrong
 the correct answer was ['D'] but you answered []

You got that question number 5 wrong
 the correct answer was ['B'] but you answered ['A']

You got that question number 6 wrong
 the correct answer was ['D'] but you answered []

You got that question number 7 wrong
 the correct answer was ['B'] but you answered ['C']

You got that question number 8 wrong
 the correct answer was ['D'] but you answered []

You got that question number 9 wrong
 the correct answer was ['B'] but you answered ['A']

You got that question number 10 wrong
 the correct answer was ['D'] but you answered []

You got that question number 12 wrong
 the correct answer was ['D'] but you answered []

You got that question number 13 wrong
 the correct answer was ['B'] but you answered ['A']

You got that question number 14 wrong
 the correct answer was ['D'] but you answered []

You got that question number 15 wrong
 the correct answer was ['B'] but you answered ['C']

You got that question number 16 wrong
 the correct answer was ['D'] but you answered []

You got that question number 17 wrong
 the correct answer was ['B'] but you answered ['C']

You got that question number 18 wrong
 the correct answer was ['D'] but you answered []

You got that question number 19 wrong
 the correct answer was ['B'] but you answered ['C']

You got that question number 20 wrong
 the correct answer was ['D'] but you answered []

You got that question number 21 wrong
 the correct answer was ['B'] but you answered ['C']

You got that question number 22 wrong
 the correct answer was ['D'] but you answered []

You got that question number 23 wrong
 the correct answer was ['B'] but you answered ['D']

You got that question number 24 wrong
 the correct answer was ['D'] but you answered []

You got that question number 25 wrong
 the correct answer was ['B'] but you answered ['A']

You got that question number 26 wrong
 the correct answer was ['D'] but you answered []

You got that question number 27 wrong
 the correct answer was ['B'] but you answered ['D']

You got that question number 28 wrong
 the correct answer was ['D'] but you answered []

You got that question number 29 wrong
 the correct answer was ['B'] but you answered ['C']

You got that question number 30 wrong
 the correct answer was ['D'] but you answered []

You got that question number 31 wrong
 the correct answer was ['B'] but you answered ['C']

You got that question number 32 wrong
 the correct answer was ['D'] but you answered []

You got that question number 34 wrong
 the correct answer was ['D'] but you answered []

You got that question number 35 wrong
 the correct answer was ['B'] but you answered ['D']

You got that question number 36 wrong
 the correct answer was ['D'] but you answered []

You got that question number 37 wrong
 the correct answer was ['B'] but you answered ['D']

You got that question number 38 wrong
 the correct answer was ['D'] but you answered []

 The number of correctly answered questions:  2
 The number of incorrectly answered questions:  18
 Your grade is 10 %

它没有比较正确的数据,请帮我纠正这个问题。只有20个答案,文件中的答案如下:

B
D
A
A
C
A
B
A
C
C
C
C
D
A
D
C
C
B
D
D

每个人都有自己的路线。所以我尝试使用循环来回答答案键中的每个答案,并将其与此文件中的每个答案进行比较。谁能告诉我我的python代码中有什么问题?

2 个答案:

答案 0 :(得分:0)

您的算法不是您所期望的。您正在使用readline循环浏览文件,然后对于该文件中的每一行,您都试图遍历应答键。文件中的每一行都返回两个字符('B\n'),这是字体和换行符。当您执行for answerLine, studentLine in zip (answerKey, studentExam):行时,您{2}使用2元素studentExam zip长答案键(请记住字符串是可迭代的),因此您只能看到第一个回答键的人(以及第二个学生回答空白。

我建议您在算法开始时一次性阅读学生的答案,然后在该完整列表中使用zip。那会给你你想要的。

P.S。,你可能想要这个:

answer = answerLine.strip()
studentAnswer = studentLine.strip()

而不是:

answer = answerLine.split()
studentAnswer = studentLine.split()

答案 1 :(得分:0)

不是遍历文件,而是一次性将所有文件读入列表。然后,您还想要清理数据行。这可以通过以下方式实现:

answers = open('answers.txt', 'r').readlines()
answers = [answer.strip() for answer in answers]

这会使你的while循环没有意义,因为所有这些工作都要考虑在内。

一旦我们拥有了这个,就可以使用该列表了。

for answerLine, studentLine in zip(answerKey, answers):

这将为您提供以下输出(如果放置正确):

Correct    Your    Status
Ans.    Ans.
-----------------------

('You got that question number', 10, 'wrong\n the correct answer was', ['D'], 'but you answered', ['C'])
('You got that question number', 11, 'wrong\n the correct answer was', ['B'], 'but you answered', ['C'])
('You got that question number', 20, 'wrong\n the correct answer was', ['A'], 'but you answered', ['D'])
(' The number of correctly answered questions: ', 17)
(' The number of incorrectly answered questions: ', 3)
(' Your grade is', 85, '%')
Congrats you have passed

另外,我强烈不鼓励使用空except块。这将使您的代码调试成为一场噩梦,因为您将无法确定哪些内容可能出错以及在哪里。