Programa de perguntas e respostas usando listas e dicionários

Boa tarde!

Criamos uma lista de dicionários com perguntas e respostas. Sendo que quando selecionamos um dicionário para ler as perguntas está dando erro de KeyError: ‘pergunta’.

Antes de colocar os dicionários na lista estava funcionando, mas agora parou de funcionar.

Agradeço desde já pela a ajuda.

Segue abaixo o código:Texto pré-formatado

listaQuestoes = [{'carro': {'Pergunta 1': {'pergunta': 'cor do carro', 'respostas': {'a': 'branca', 'b': 'preto', 'c': 'cinza', 'd': 'prata', 'e': 'vermelho'}, 'resposta_certa': 'marca'}, 'Pergunta 2': {'pergunta': 'fiat', 'respostas': {'a': 'fiat', 'b': 'chevrolet', 'c': 'volkswage', 'd': 'volvo', 'e': 'celta'}, 'resposta_certa': 'c'}}},
                 {'carro2': {'Pergunta 1': {'pergunta': 'cor do carro', 'respostas': {'a': 'ciano', 'b': 'violeta', 'c': 'roxa', 'd': 'marrom', 'e': 'amarela'}, 'resposta_certa': 'd'}, 'Pergunta 2': {'pergunta': 'nome do carro', 'respostas': {'a': 'celta', 'b': 'corsa', 'c': 'camaro', 'd': 'gol', 'e': 'golf'}, 'resposta_certa': 'd'}}}]

titulo = 'carro'

# for i in range(len(listaQuestoes)):
#     if titulo in listaQuestoes[i]:
#         perguntas = listaQuestoes[i]

perguntas = listaQuestoes[0]

respostasCertas = 0

for pk, pv in perguntas.items():  # Pergunta key, pergunta values
    print(f'{pk}: {pv["pergunta"]}')

    print('Escolha uma das opções: ')
    for rk, rv in pv['respostas'].items():  # Resposta key, resposta values
        print(f'[{rk}]: {rv}')

    respostaUsuario = input('Sua resposta: ')
    if respostaUsuario == pv['resposta_certa']:
        print('Muito bem! Você acertou.')
        respostasCertas += 1
    else:
        print('Errou! Preste mais atenção!')
    print()

quantPerguntas = len(perguntas)
porcentagemAcerto = respostasCertas / quantPerguntas * 100
print(f'Você acertou  {respostasCertas} resposta(s).')
print(f'Sua porcentagem foi {porcentagemAcerto}%')

Primeiro você precisa entender a estrutura que criou.

listaQuestoes tem 2 elementos, e cada um deles é um dicionário. Se você fizer, por exemplo:

perguntas = listaQuestoes[0]
print(perguntas)

A saída será:

{'carro': {'Pergunta 1': {'pergunta': 'cor do carro', 'respostas': {'a': 'branca', 'b': 'preto', 'c': 'cinza', 'd': 'prata', 'e': 'vermelho'}, 'resposta_certa': 'marca'}, 'Pergunta 2': {'pergunta': 'fiat', 'respostas': {'a': 'fiat', 'b': 'chevrolet', 'c': 'volkswage', 'd': 'volvo', 'e': 'celta'}, 'resposta_certa': 'c'}}}

Ou seja, é um dicionário que só tem uma única chave, chamada “carro”. O valor desta chave é outro dicionário, que contém 2 chaves: “Pergunta 1” e “Pergunta 2” - e aqui dá o erro porque você tenta acessar a chave “pergunta” deste dicionário, mas na verdade a chave “pergunta” está dentro de outros dicionários (os que são os valores das chaves “Pergunta 1” e “Pergunta 2”).

Se você identar dá para perceber melhor:

{ <-- "{" indica que é o início do dicionário
    'carro': { <-- chave "carro", cujo valor é outro dicionário, que contém as chaves "Pergunta 1" e "Pergunta 2"
        'Pergunta 1': { <-- chave "Pergunta 1", cujo valor é outro dicionário (e esse sim, tem a chave "pergunta")
            'pergunta': 'cor do carro',
            'respostas': {
                'a': 'branca',
                'b': 'preto',
                'c': 'cinza',
                'd': 'prata',
                'e': 'vermelho'
            },
            'resposta_certa': 'marca'
        },  <-- fim do dicionário correspondente à chave "Pergunta 1"
        'Pergunta 2': { <-- chave "Pergunta 2", cujo valor é outro dicionário (e esse sim, tem a chave "pergunta")
            'pergunta': 'fiat',
            'respostas': {
                'a': 'fiat',
                'b': 'chevrolet',
                'c': 'volkswage',
                'd': 'volvo',
                'e': 'celta'
            },
            'resposta_certa': 'c'
        } <-- fim do dicionário correspondente à chave "Pergunta 2"
    } <-- fim do dicionário correspondente à chave "carro"
} <-- fim do dicionário principal

Então ao fazer for pk, pv in perguntas.items(), pk será “carro” e pv será o dicionário que tem as chaves “Pergunta 1” e “Pergunta 2”.

Obs: na “Pergunta 1”, a resposta certa não deveria ser alguma das letras, em vez de "marca"? E na “Pergunta 2”, a “pergunta” realmente é “fiat”? Enfim…

Dito tudo isso, eu faria assim:

listaQuestoes = [{'carro': {'Pergunta 1': {'pergunta': 'cor do carro', 'respostas': {'a': 'branca', 'b': 'preto', 'c': 'cinza', 'd': 'prata', 'e': 'vermelho'}, 'resposta_certa': 'marca'}, 'Pergunta 2': {'pergunta': 'fiat', 'respostas': {'a': 'fiat', 'b': 'chevrolet', 'c': 'volkswage', 'd': 'volvo', 'e': 'celta'}, 'resposta_certa': 'c'}}},
                 {'carro2': {'Pergunta 1': {'pergunta': 'cor do carro', 'respostas': {'a': 'ciano', 'b': 'violeta', 'c': 'roxa', 'd': 'marrom', 'e': 'amarela'}, 'resposta_certa': 'd'}, 'Pergunta 2': {'pergunta': 'nome do carro', 'respostas': {'a': 'celta', 'b': 'corsa', 'c': 'camaro', 'd': 'gol', 'e': 'golf'}, 'resposta_certa': 'd'}}}]

titulo = 'carro'
perguntas = None
for d in listaQuestoes: # para cada elemento em listaQuestoes
    # "d", no caso, será o dicionário que contém a chave "carro", depois o que tem a chave "carro2"...
    if titulo in d: # se o titulo é chave do dicionário
        perguntas = d[titulo] # pega o dicionário interno (o que tem as chaves "Pergunta 1" e "Pergunta 2")
        break # se já encontrei o que queria, posso interromper o loop

if perguntas: # se encontrou o titulo
    print(f'Perguntas para {titulo}')
    respostasCertas = 0
    for numero, dados in perguntas.items():
        print(f'{numero} - {dados["pergunta"]}\nEscolha uma das opções: ')
        for opcao, resp in dados["respostas"].items():
            print(f'[{opcao}]: {resp}')
        respostaUsuario = input('Sua resposta:')
        if respostaUsuario == dados['resposta_certa']:
            print('Muito bem! Você acertou.')
            respostasCertas += 1
        else:
            print('Errou! Preste mais atenção!')

    porcentagemAcerto = respostasCertas / len(perguntas)
    print(f'Você acertou {respostasCertas} resposta(s).')
    print(f'Sua porcentagem foi {porcentagemAcerto:.2%}')

Repare que no final usei a formatação de porcentagem (.2% - que mostra com 2 casas decimais, e note que não preciso multiplicar por 100, pois a formatação já cuida desses detalhes). Consulte a documentação para saber mais sobre as opções de formatação.

1 curtida

Olá!

Boa tarde!
Muito obrigado pela resposta funcionou!!!

Gratidão