Estou fazendo um exercício do curso de computação, e estamos trabalhando em equipe. Tenho aprendido bastante Python, mas existem comandos que não entendo. Por exemplo o código abaixo não está comparando os valores que estão na lista com os do dicionário história, não estou entendendo o porquê.
Segue o código abaixo:
from time import sleep
def linha():
print('~'*30)
def mostrarTemas(): #No código principal, vai servir a função de ewerton
for i in range(len(historias)):
if not historias[i]['tema'] in lista:
lista.append(historias[i]['tema']) # Se tiver tema repetido - Deixa apenas um
for p, i in enumerate(lista):
print(f' {p + 1}- \033[1;33m{i}\033[m') # Mostra pro usuário os temas disponiveis
sleep(0.3)
#Lista de histórias, todas conforme o professor cadastrar.
lista = []
historias = [{'tema':'Princesas', 'titulo':'A princesa', 'A princesa':'Texto da Princesa aqui'},
{'tema':'Super Herois', 'titulo':'Iron Man 2', 'Iron Man 2':'A historia aqui'},
{'tema':'Princesas', 'titulo':'A princesa 2', 'A princesa 2':'Texto da princesa 2 aqui'},
{'tema':'Carros', 'titulo':'Carros 1', 'Carros 1':'Texto para carros 1'}]
linha()
mostrarTemas()
linha()
escolha = int(input(('Digite o número que está relacionado com o tema a sua escolha: ')))
historia = dict()
for i in range(len(historias)):
if escolha == i+1:
# se tiver mais de um tema igual faz um random pra escolher uma aleatoriamente
for historia in historias: #Problema é o que quando existe um tema repetido
print(historia)
if lista[i] in historia: # Nunca dar True
print(historia)
print(f'\033[1;30m{historia["titulo"]}\033[m') #Quando faço a escolha ele mostra o errado
# print(f"Tema: {lista[i]}")
# print(f'\033[1;30m{historias[lista[i]][titulo.__str__()]}\033[m')
Se quer eliminar itens repetidos, use um set, assim você não precisa verificar se o elemento já existe (o próprio set cuida disso para você). A desvantagem é que um set não garante a ordem dos elementos, então a lista de temas pode mudar de ordem a cada execução.
Você pode passar um valor inicial para enumerate, assim não precisa somar 1 (mas vai precisar subtrair 1 do valor digitado pelo usuário).
Não use variáveis globais. Faça a função mostrarTemas receber as histórias como parâmetro, e retornar a lista de temas.
Para ler a escolha do usuário, fiz um loop que valida o valor digitado, e caso seja inválido, pede que digite novamente.
Ficaria assim:
def linha():
print('~' * 30)
# recebe as histórias como parâmetro
def mostrarTemas(historias):
temas = set()
for historia in historias:
temas.add(historia['tema']) # o set já verifica se o elemento é repetido
temas = list(temas) # transforma o set em lista, pois set's não tem ordem definida
for i, tema in enumerate(temas, start=1): # mostra os temas
print(f' {i}- {tema}')
return temas # retorna a lista de temas
# Lista de histórias
historias = [{'tema':'Princesas', 'titulo':'A princesa', 'A princesa':'Texto da Princesa aqui'},
{'tema':'Super Herois', 'titulo':'Iron Man 2', 'Iron Man 2':'A historia aqui'},
{'tema':'Princesas', 'titulo':'A princesa 2', 'A princesa 2':'Texto da princesa 2 aqui'},
{'tema':'Carros', 'titulo':'Carros 1', 'Carros 1':'Texto para carros 1'}]
linha()
temas = mostrarTemas(historias)
linha()
while True: # enquanto a escolha não for válida, pede que digite novamente
try:
escolha = int(input(('Digite o número que está relacionado com o tema a sua escolha: ')))
if 1 <= escolha <= len(temas):
break # escolha válida, sai do while
else:
print(f'Número deve estar entre 1 e {len(temas)}')
except ValueError: # se não digitar número, dá erro
print('Digite um número válido')
tema_escolhido = temas[escolha - 1]
for historia in historias:
# se a história tem o tema escolhido, imprime
if historia['tema'] == tema_escolhido:
print(historia)
print(f'{historia["titulo"]}')