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.