How to not return only the last sentence in for loop?

Asked

Viewed 46 times

1

I’m creating a for to store the data of each event in a sentence and then join it in a string. However, I only get a return of the last value.

qtd_eventos = int(input('Informe a quantidade de eventos: '))

eventos_advesos = []
previsibilidades = []
descricoes = []

for i in range(qtd_eventos):
  print('-----------------------NOVO EVENTO--------------------------')
  eventos_advesos.append(input('Informe o evento adverso: '))
  print('------------------------------------------------------------')
  previsibilidades.append(input('Informe a previsibilidade em bula: '))
  print('------------------------------------------------------------') 
  descricoes.append(input('Informe se o evento é descrito em bula: '))
  print('------------------------------------------------------------')

analise_eventos = list([f'{i} é ' for i in eventos_advesos])
analise_previsao = list([f'classificado como {e} ' for e in previsibilidades])
analise_descricao = list([f'e {a} segundo a bula.' for a in descricoes])

for i in analise_eventos:
  evento = i
for e in analise_previsao:
  evento = i + e 
for a in analise_descricao:
  evento = i + e + a

print(evento)

1 answer

1


This here:

analise_eventos = list([f'{i} é ' for i in eventos_advesos])
analise_previsao = list([f'classificado como {e} ' for e in previsibilidades])
analise_descricao = list([f'e {a} segundo a bula.' for a in descricoes])

It doesn’t seem to make much sense. I see no reason to create 3 additional lists with the texts, then try to join them.

Even if it made sense, then you do it:

for i in analise_eventos:
    evento = i

That is, every iteration of the loop, you overwrite the value of evento. That’s why in the end this variable will only have the last value.


If the idea is just to print, you don’t need all this work. You can scroll through the lists simultaneously with zip, and then just print the data in the desired format:

for evento, prev, desc in zip(eventos_advesos, previsibilidades, descricoes):
    print(f'{evento} é classificado como {prev} e {desc} segundo a bula')

With each iteration of for, the variables evento, prev and desc will be one of the elements of the lists eventos_advesos, previsibilidades and descricoes.

But if you really want to create a variable containing all the text, for all the elements, you can use join along with a Generator Expression:

texto = '\n'.join( # separa os textos por "\n" (quebra de linha)
    f'{evento} é classificado como {prev} e {desc} segundo a bula'
    for evento, prev, desc in zip(eventos_advesos, previsibilidades, descricoes)
)
print(texto)

In case, I used \n (line break), so the texts will be one in each line. But you can use the character you want - for example, if you do ', '.join(etc...), texts will be separated by comma and space.


Alternative to the 3 lists

But if the idea is to store related information (because I understood that each event has its respective predictability and description), a better option than having 3 lists is to have a single list, and group the information into one tuple:

dados = []
for i in range(qtd_eventos):
  evento = input('Informe o evento adverso: ')
  previsibilidade = input('Informe a previsibilidade em bula: ')
  descricao = input('Informe se o evento é descrito em bula: ')
  dados.append((evento, previsibilidade, descricao)) # insere uma tupla com as 3 informações

Note the additional parentheses, they are important. If I just:

dados.append(evento, previsibilidade, descricao)

This gives error because I am passing 3 parameters to append. But by placing the additional parentheses, I’m creating a tuple containing the 3 values (evento, previsibilidade and descricao) and insert this tuple into the list dados.

Then just go through this list and get the values of each tuple:

for evento, prev, desc in dados:
    print(f'{evento} é classificado como {prev} e {desc} segundo a bula')

# ou
texto = '\n'.join(
    f'{evento} é classificado como {prev} e {desc} segundo a bula'
    for evento, prev, desc in dados
)
print(texto)

Browser other questions tagged

You are not signed in. Login or sign up in order to post.