[英]Python 3.3 - Multiple choice reading from list and .txt then grade
I have tried this program in three different ways I know I got close several times but after failing so many times I have given up and need an extra set of eyes. 我以三种不同的方式尝试了该程序,我知道我已经接近了几次,但是失败了很多次之后,我放弃了,需要额外的眼睛。 The program is "simple" I know but I know I am over thinking it.
我知道该程序是“简单的”,但我知道我已经过度思考了。
Program should store correct answers in a list. 程序应在列表中存储正确答案。 Using that list to grade the 20 question test.
使用该列表对20个问题进行评分。 Then read that student.txt file to determine how the student answered.
然后阅读该student.txt文件,以确定学生如何回答。 After reading the .txt file it should grade then display pass or fail (passing = 15 or greater) It finally displays the total number or correct, incorrect answers with a list of the questions missed by the student.
读取.txt文件后,应进行评分,然后显示通过或不通过(通过= 15或更高),最后显示总数或正确,不正确的答案以及学生遗漏的问题列表。
Below are all three attempts. 以下是所有三种尝试。 Any help is greatly appreciated.
任何帮助是极大的赞赏。
answerKey = [ B, D, A, A, C, A, B, A, C, D, B, C, D, A, D, C, C, B, D, A,]
studentExam = [ B, D, A, D, C, A, B, A, C, A, B, C, D, A, D, C, C, B, D, A,]
index = 0
numCorrect = 0
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 ')
answerKey.close()
studentExam.close()
# This program stores the correct answer for a test
# then reads students answers from .txt file
# after reading determines and dislpays pass or fail (15 correct to pass)
# Displays number of correct and incorrect answers for student
# then displays the number for the missed question/s
#Creat the answer list
def main ( ):
# Create the answer key list
key = [ B, D, A, A, C, A, B, A, C, D, B, C, D, A, D, C, C, B, D, A,]
print (key)
# Read the contents of the student_answers.txt and insert them into a list
def read_student( ):
# Open file for reading
infile = open ( 'student_answers.txt', 'r' )
# Read the contents of the file into a list
student = infile.readlines ( )
# Close file
infile.close ( )
# Strip the \n from each element
index = 0
while index < len(student):
student[index] = student[index].rstrip ( '\n' )
# Print the contents of the list
print (student)
# Determine pass or fail and display all results
def pass_fail(answers, student):
# Lists to be used to compile amount correct,
# amount wrong, and questions number missed
correct_list = []
wrong_list = []
missed_list = []
# For statement to compile lists
for ai,bi in zip (key,student):
if ai == bi:
correct_list.append(ai)
else:
wrong_list.append(ai)
missed_list.append(ai)
# Printing results for user
print(correct_list,' were answered correctly')
print(wrong_list,' questions were missed')
# If statement to determine pass or fail
if len(correct_list) >=15:
print('Congrats you have passed')
else:
print('Sorry you have faild please study and try, \
again in 90 days')
print('Any attempt to retake test before 90 days, \
will result in suspension of any licenses')
# Displaying the question number for the incorrect answer
print ( 'You missed questions number ', missed_list)
main()
a = (1, 'A'),(2,'C'),(3,'B')
b = (1,'A'), (2,'A'),(3,'C')
correct_list = []
wrong_list = []
missed_list = []
for ai, bi in zip (a, b):
if ai == bi:
correct_list.append(ai)
else:
wrong_list.append(ai)
missed_list.append(ai)
index(ai)+1
print(correct_list,'answered correct')
print(wrong_list, 'answered wrong')
if len(correct_list) >=2:
print ('Congrats you have passed')
else:
print ('Sorry you have faild please study and try again in 90 days')
print('Any attempt to retake test before 90 days will result in suspension of any lisences')
print ('Question number missed', missed_list)
So, I decided to work off of your second example, since it was the easiest for me to follow. 因此,我决定从您的第二个示例开始,因为这是我最容易遵循的示例。
Here is a modified file, with explanations, which does what I think you want. 这是一个经过修改的文件,带有说明,可以满足我的要求。 I assumed the student answers were in a text file called
student_answers.txt
and had one answer per line. 我假设学生的答案在一个名为
student_answers.txt
的文本文件中,并且每行有一个答案。
#!/usr/bin/env python
def read_student(path):
with open(path, 'r') as infile:
contents = infile.read()
# Automatically gets rid of the newlines.
return contents.split('\n')
def pass_fail(answers, student):
correct_list = []
wrong_list = []
# Use the 'enumerate' function to return the index.
for index, (ai, bi) in enumerate(zip(answers, student)):
# since problems start with 1, not 0
problem_number = index + 1
if ai == bi:
correct_list.append(problem_number)
else:
wrong_list.append(problem_number)
# Print the length of the list, not the list itself.
print(len(correct_list), 'were answered correctly')
print(len(wrong_list), 'questions were missed')
if len(correct_list) >= 15:
print('Congrats, you have passed')
else:
print('Sorry, you have failed. Please study and try again in 90 days')
print('Any attempt to retake test before 90 days will result in suspension of any licenses')
# Display each missed number on a separate line
print ('You missed questions numbers:')
for num in wrong_list:
print(' ' + str(num))
def main( ):
key = ['B', 'D', 'A', 'A', 'C', 'A', 'B', 'A', 'C', 'D', 'B', 'C',
'D', 'A', 'D', 'C', 'C', 'B', 'D', 'A']
student_answers = read_student('student_answers.txt')
pass_fail(key, student_answers)
if __name__ == '__main__':
main()
Some general comments: 一些一般性的评论:
main
function, you created a key, printed it, and tried to access it inside the pass_fail
function. main
函数中,您创建了一个密钥,将其打印出来,并尝试在pass_fail
函数中对其进行访问。 That won't work -- when you create a variable inside a function, it is not automatically accessible outside of the function. key
a global variable. key
设为全局变量。 This is an undesirable solution key
variable into the pass_fail
function. key
变量传递给pass_fail
函数。 This is what I did. Your code to read the student's file was a bit too complex. 您读取学生档案的代码太复杂了。 You could use the
with
statement, which automatically opens and closes the file object ( infile
) for you. 您可以使用
with
语句,它将自动为您打开和关闭文件对象( infile
)。 Similarly, Python comes with built-in ways to help split the string in your textfile up and remove the newline character. 同样,Python带有内置方法来帮助拆分文本文件中的字符串并删除换行符。 In addition, for the future, you can also iterate over each line in a file like the below instead of manually looping through it:
另外,为了将来,您也可以像下面这样遍历文件中的每一行,而不用手动循环遍历它:
with open('file.txt') as my_file: for line in my_file: print(line) # The newline is still a part of the string!
I'm not sure why you had both the wrong_list
and missed_list
variables inside pass_fail
. 我不知道为什么你有两个
wrong_list
和missed_list
内部变量pass_fail
。 I deleted missed_list
. 我删除了
missed_list
。
for
loop was that you were storing the correct answers, not the problem numbers. for
循环的问题是您存储的是正确答案,而不是问题编号。 To solve that, I used the built-in enumerate
function which is quite useful for this sort of thing. enumerate
函数,它对于这种事情非常有用。 Alternatively, you could have used a variable and incremented it once per loop. print
statements were a little malformed, so I cleaned that up print
声明有些不正确,所以我整理了一下 Your first answer is rather close except that Python is interpreting the A,B,C and D as variables and not characters. 您的第一个答案非常接近,除了Python将A,B,C和D解释为变量而不是字符。 You left the grading logic in your for loop.
您将评分逻辑留在了for循环中。 After changing the array to be characters instead of variables I got the following result:
将数组更改为字符而不是变量后,得到以下结果:
The number of correctly answered questions: 1
The number of incorrectly answered questions: 19
Your grade is 5 %
You have not passed
The number of correctly answered questions: 2
The number of incorrectly answered questions: 18
Your grade is 10 %
You have not passed
The number of correctly answered questions: 3
The number of incorrectly answered questions: 17
Your grade is 15 %
You have not passed
You got that question number 4 wrong
the correct, answer was ['A'] but you answered ['D']
The number of correctly answered questions: 3
The number of incorrectly answered questions: 17
Your grade is 15 %
You have not passed
The number of correctly answered questions: 4
The number of incorrectly answered questions: 16
Your grade is 20 %
You have not passed
The number of correctly answered questions: 5
The number of incorrectly answered questions: 15
Your grade is 25 %
You have not passed
The number of correctly answered questions: 6
The number of incorrectly answered questions: 14
Your grade is 30 %
You have not passed
The number of correctly answered questions: 7
The number of incorrectly answered questions: 13
Your grade is 35 %
You have not passed
The number of correctly answered questions: 8
The number of incorrectly answered questions: 12
Your grade is 40 %
You have not passed
You got that question number 10 wrong
the correct, answer was ['D'] but you answered ['A']
The number of correctly answered questions: 8
The number of incorrectly answered questions: 12
Your grade is 40 %
You have not passed
The number of correctly answered questions: 9
The number of incorrectly answered questions: 11
Your grade is 45 %
You have not passed
The number of correctly answered questions: 10
The number of incorrectly answered questions: 10
Your grade is 50 %
You have not passed
The number of correctly answered questions: 11
The number of incorrectly answered questions: 9
Your grade is 55 %
You have not passed
The number of correctly answered questions: 12
The number of incorrectly answered questions: 8
Your grade is 60 %
You have not passed
The number of correctly answered questions: 13
The number of incorrectly answered questions: 7
Your grade is 65 %
You have not passed
The number of correctly answered questions: 14
The number of incorrectly answered questions: 6
Your grade is 70 %
You have not passed
The number of correctly answered questions: 15
The number of incorrectly answered questions: 5
Your grade is 75 %
You have not passed
The number of correctly answered questions: 16
The number of incorrectly answered questions: 4
Your grade is 80 %
Congrats you have passed
The number of correctly answered questions: 17
The number of incorrectly answered questions: 3
Your grade is 85 %
Congrats you have passed
The number of correctly answered questions: 18
The number of incorrectly answered questions: 2
Your grade is 90 %
Congrats you have passed
Traceback (most recent call last):
File "a1.py", line 39, in <module>
answerKey.close()
AttributeError: 'list' object has no attribute 'close'
The last error was because you had closed the array which was probably a file object at one point but you are pretty close. 最后一个错误是因为您曾经关闭了一个数组,该数组可能是一个文件对象,但是非常接近。 Just a small syntax error.
只是一个小的语法错误。
Short version, but does the job. 简短的版本,但能胜任。
correct = ['B', 'D', 'A', 'A', 'C', 'A', 'B', 'A', 'C', 'D', 'B', 'C', 'D', 'A', 'D', 'C', 'C', 'B', 'D', 'A']
file_handler = open('student_answers.txt','r')
answers = file_handler.readlines()
valid = 0
for element in enumerate(correct):
if answers[element[0]].rstrip("\n") == element[1]:
valid += 1
if valid >= 15:
print("Congrats, you passed with " + str((valid/20)*100) + "%")
else:
print("Sorry, you failed with " + str((valid/20)*100) + "%")
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.