The prompt for the problem goes as follows:
Create an interactive student records system.
Prompt the user for a student name.
Then prompt the user for a numeric grade
Repeat this until the user enters ‘done’ in place of a name.
Then print each student and the average of their grades
I have come up with the following code (I’m a beginner guys, sorry if this is obvious)
# I am creating a dictionary so I can store multiple values that are associated with one name lst = [] dict = {} while True: try: name = str(input("Please enter student's name.")) grade = int(input("Please enter grade student recieved.")) if (name not in list(dict.keys()) and name != "done"): lsst = [] lsst.append(grade) dict[name] = lsst print(lsst) continue elif name in list(dict.keys()): lsst.append(grade) print(lsst) continue elif name == "done": break except ValueError: print("Try Again") pass for i in range(list(dict.keys())): print(f"{name}: {grade}")
I am trying to print the averages after I type ‘done’ for the name input, but it just moves on to the next input inquiry. Why is this, and how do I fix it?
Advertisement
Answer
There are many mistakes in the code but I will break them down in my corrected version.
names_and_grades = {} # I renamed this variable because there is a built in type called dict in Python. while True: # Using while True is usually discouraged but in this case, it's hard to avoid that. try: name = input("Please enter student's name.") # No need to convert to string as it takes the input as a string by default. if name == "done": # After you prompted for a name immediately check whether the user entered done. This way, you can break right after that. break grade = int(input("Please enter grade student recieved.")) if name not in names_and_grades.keys(): names_and_grades[name] = [grade] # We don't actually need a separate list as the entry in the dictionary will be the list itself (that's why it's put between brackets). elif name in names_and_grades.keys(): names_and_grades[name].append(grade) # Once the list was declared, you can simply append it. print(names_and_grades[name]) # No need to repeat this twice in the if-else statements, you can just write it after them. And a very important thing, there is no need to use continue, since you are using if-elfe. When you are using if-else, only one of the blocks will be used, the first block where the condition evaluates as true. except ValueError: print("Try Again") for k in names_and_grades.keys(): print(f"{k}: {names_and_grades[k]}") # This is the simplest way to iterate through a dictionary (if you want to format the entries), by iterating through the keys of the dictionary and with the help of the keys, calling the appropriate values.
I hope this helps, let me know if something is unclear.