Your lists contatoNome
, contatoIdade
and contatoNumero
are saving all values, so it’s no use adding them to lista1
and lista2
, for then both will have all the values too.
In fact I suggest reviewing the way you’re structuring the data. If the name, age and number are related (if all the information refers to the same person), it makes more sense to keep them together, rather than having separate lists.
One option would be to create a tuple for each person, and store these tuples in a list:
# lista que guarda todos os contatos
contatos = []
while True:
nome = input('Qual o nome? ')
idade = int(input('Digite a idade: '))
numero = input('Digite o numero: ')
# adiciona a tupla (nome, idade, numero) na lista de contatos
contatos.append((nome, idade, numero))
entrada = input("Deseja sair?\n")
if entrada.lower() == "s":
break # sai do while
maiores = []
menores = []
# separa os contatos por idade
for contato in contatos:
if contato[1] > 18:
maiores.append(contato)
else:
menores.append(contato)
print(maiores)
print(menores)
Notice that I did contatos.append((nome, idade, numero))
: these parentheses seem redundant, but are not.
If I just did contatos.append(nome, idade, numero)
would be wrong, because the method append
would be receiving 3 parameters (but it only gets 1). By putting an extra pair of parentheses, I’m creating a tuple containing the name, age and number, and this tuple is being inserted into the list contatos
.
At the end of while
, the list contatos
will have several tuples, each referring to a person’s data.
Then just loop in contatos
and filter according to age by inserting the person in the respective list.
If you want to display the data in alphabetical order of the name, just use sorted
and define the ordering criterion (which I understand will be the name):
def getnome(contato):
return contato[0]
print(sorted(maiores, key=getnome))
print(sorted(menores, key=getnome))
And of course, once you have the data you need, you can print the way you want. For example:
print('maiores de 18:')
for nome, idade, fone in sorted(maiores, key=getnome):
print(f'nome: {nome}, idade: {idade}, fone: {fone}')
But then it is already a matter of formatting, because the most important (separate the data correctly) has already been solved.
Another option is to store the data in dictionaries instead of tuples:
# lista que guarda todos os contatos
contatos = []
while True:
nome = input('Qual o nome? ')
idade = int(input('Digite a idade: '))
numero = input('Digite o numero: ')
# adiciona um dicionário na lista de contatos
contatos.append({ 'nome': nome, 'idade': idade, 'numero': numero })
entrada = input("Deseja sair?\n")
if entrada.lower() == "s":
break # sai do while
maiores = []
menores = []
# separa os contatos por idade
for contato in contatos:
if contato['idade'] > 18:
maiores.append(contato)
else:
menores.append(contato)
def getnome(contato):
return contato['nome']
print(sorted(maiores, key=getnome))
print(sorted(menores, key=getnome))
# ou, mostrando os dados de outra maneira:
print('maiores de 18:')
for contato in sorted(maiores, key=getnome):
print(f'nome: {contato["nome"]}, idade: {contato["idade"]}, fone: {contato["numero"]}')
# repita para a lista menores (ou crie uma função para imprimir os dados)
Regardless of the chosen form (tuple or dictionary), the important thing is that now all the information of a person is together in a single structure (each tuple or dictionary represents a person), which is much better when working with the data: instead of being "hunting" information in different lists, you have everything in one element.
If you already have Dict
contato
why don’t you use it?– Augusto Vasques