Home > Software design >  Randomize questions from web API and print out wrong answer
Randomize questions from web API and print out wrong answer

Time:10-18

I want to get 10 random questions from an web API with many questions, but I dont seem to get it to work. Right now im getting KeyError: 'prompt', but I dont know if the function is correct at all as I have been trying a few diffrent options.

Im also trying to print out in the end which questions you get wrong, but with no luck there either.

import random
import requests
from random import randint

url = ""
the_questions = requests.get(url).json()
print("------ Welcome to Python quiz ------")


def random_question():
    data = the_questions['prompt']
    random_index = randint(0, len(data)-1)
    return data[random_index]['prompt']


def get_correct_answers(answers):
    res = []
    for ans in answers:
        if ans['correct']:
            res.append(ans['answer'])
    return res


def get_numeric(prompt, max_value,):
    while True:
        try:
            res = int(input(prompt))
        except ValueError:
            print("Answer only with a number!")
            continue
        if 0 < res < max_value:
            break
        else:
            print("Invalid answer option!")
    return res


def main():
    score = 0
    for questions in the_questions['questions']:
        #print(questions['prompt'])
        print(random_question())

        for i, a in enumerate(questions['answers'], start=1):
            print(f"[{i}] {a['answer']}")
        user_answer = get_numeric("> ", len(questions['answers'])   1)

        if questions['answers'][user_answer - 1]['correct']:
            score  = 1
            print(f"Right!")
        else:
            all_correct = ", ".join(get_correct_answers(questions['answers']))
            print(f"Wrong, right is: {all_correct}")
    print(f"You got {score} points of {len(the_questions['questions'])} possible!")


if __name__ == '__main__':
    main()

Sample of the API

{"questions":[{"id":"1","prompt":"Which functions is used to write out text in the terminal?","answers":[{"answer":"print","correct":true},{"answer":"input","correct":false},{"answer":"import","correct":false},{"answer":"sys.exit","correct":false}]}

CodePudding user response:

Error shows problem with key prompt and you use it only in random_question().

If you use print() to see values in variables random_question() then you will see that you need

    data = the_questions['questions']

instead of

    data = the_questions['prompt']

As for me name of variables are missleading. You should use name data for all information from API and later questions = data['questions'] could make sense.


EDIT:

My version with random.shuffle()

import random
#import requests
import json

def get_correct_answers(answers):
    res = []
    for ans in answers:
        if ans['correct']:
            res.append(ans['answer'])
    return res

def get_numeric(prompt, max_value,):
    while True:
        try:
            res = int(input(prompt))
        except ValueError:
            print("Answer only with a number!")
            continue
        if 0 < res < max_value:
            break
        else:
            print("Invalid answer option!")
    return res


def main():

    print("------ Welcome to Python quiz ------")
    
    #url = ""
    #data = requests.get(url).json()

    data = json.loads('''
{"questions":[
    {"id":"1","prompt":"Which functions is used to write out text in the terminal?","answers":[{"answer":"print","correct":true},{"answer":"input","correct":false},{"answer":"import","correct":false},{"answer":"sys.exit","correct":false}]},
    {"id":"2","prompt":"Which functions is used to read text from the terminal?","answers":[{"answer":"print","correct":false},{"answer":"input","correct":true},{"answer":"exec","correct":false},{"answer":"load","correct":false}]}
]}
''')

    questions = data['questions']
    random.shuffle(questions)
    
    score = 0
    
    for question in questions:
        
        print(question['prompt'])

        answers = question['answers']
        for i, a in enumerate(question['answers'], 1):
            print(f"[{i}] {a['answer']}")
            
        user_answer = get_numeric("> ", len(answers) 1)

        if answers[user_answer-1]['correct']:
            score  = 1
            print(f"Right!")
        else:
            all_correct = ", ".join(get_correct_answers(answers))
            print(f"Wrong, right is: {all_correct}")
            
    print(f"You got {score} points of {len('questions')} possible!")

if __name__ == '__main__':
    main()
  • Related