Create a contact list and separate it into two other lists

Asked

Viewed 200 times

0

I have to create a list of contacts in Python, with name, age and phone number, and then I have to separate in 2 lists: a list only with contacts over 18 years old and another list only under 18 years old and print on the screen the 2 separate lists in alphabetical order.

But I’m not getting to separate the lists, they come out this way here:

[['joao', 'maria'], [33, 12], ['1234567', '98765432']]

[['joao', 'maria'], [33, 12], ['1234567', '98765432']]

But it was supposed to come out that way:

List1:

nome: joao, idade: 33, Numero:1234567

List2:

nome: maria, idade: 12, Numero:98765432

The code is this:

contatoNome = []
contatoIdade = []
contatoNumero = []
contato = {"nome" : contatoNome, "idade" : contatoIdade, "numero" : contatoNumero}

lista1 = []
lista2 = []

entrada = ""
while entrada != "s":
    nome = input('Qual o nome? ')
    contatoNome.append(nome)
    idade = int(input('Digite a idade: '))
    contatoIdade.append(idade)
    numero = input('Digite o numero: ')
    contatoNumero.append(numero)
    entrada = input("Deseja sair? ")
    print()
    if entrada.lower() == "s":
        verificar = contato["idade"]
        for n in verificar:
            if n > 18:
                 lista1.append(contatoNome)#{"nome" : contatoNome, "idade" : contatoIdade, "numero" : contatoNumero}
                 lista1.append(contatoIdade)
                 lista1.append(contatoNumero)
            else:
                lista2.append(contatoNome)  # {"nome" : contatoNome, "idade" : contatoIdade, "numero" : contatoNumero}
                lista2.append(contatoIdade)
                lista2.append(contatoNumero)
        print()
        print(lista1)
        print()
        print(lista2)
  • 1

    If you already have Dict contato why don’t you use it?

1 answer

2


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.

  • 1

    Now it all worked out, vlw thanks o/ Really my structure was not good.

Browser other questions tagged

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