Vector names and ages - Python

1

I want to create two vectors, one for names and one for ages, which can store 10 people.

I think it would be:

pessoas = []
idades = []
for c in range(10):
    pessoas.append(input('Digite o nome da pessoa: '))
    idades.append(int(input('Digite agora a idade da pessoa: ')))

But how could I now show the younger (younger) person?

    
asked by anonymous 15.05.2018 / 15:21

2 answers

3

The logic is quite simple, but a little hard. Having the two lists, one of names and another of ages, follows:

  • Find the lowest age in the list of ages;
  • Find the position on the list where the youngest child is;
  • Check the name of the newest person in the list of names;
  • The code would look something like:

    menor_idade = min(idades)
    posicao_menor_idade = idades.index(menor_idade)
    nome = pessoas[posicao_menor_idade]
    
    print(f'{nome} é a pessoa mais nova, com {menor_idade} anos')
    

    This is a crude way to do, which slightly compromises the legibility of the code. In my view, the ideal is not to store two information that is related to each other in different lists, but in a single structure, such as a tuple. For example:

    pessoas = []
    for _ in range(10):
        nome = input('Digite o nome da pessoa: ')
        idade = int(input('Digite agora a idade da pessoa: '))
        pessoas.append((nome, idade))
    

    And search for the youngest person with:

    pessoa_mais_nova = min(pessoas, key=lambda p: p[1])
    

    Having thus, a return like: ('João', 10) .

    To make matters even worse, you can use namedtuple :

    Pessoa = namedtuple('Pessoa', ['nome', 'idade'])
    
    pessoas = []
    for _ in range(10):
        nome = input('Digite o nome da pessoa: ')
        idade = int(input('Digite agora a idade da pessoa: '))
        pessoas.append(Pessoa(nome, idade))
    
    pessoa = min(pessoas, key=lambda p: p.idade)
    

    See working at Repl.it | GitHub GIST

    Getting the return: Pessoa(nome='João', idade=10) , and can display it:

    print(f'{pessoa.nome} é a pessoa mais nova, com {pessoa.idade} anos')
    
      

    The syntax of print() with the prefix f works only in 3.6+ versions. For previous versions, use the format method.

    In version 3.7 of Python it was including the Data Class standard, which can be used in this situation, much like the LINQ put in your answer, but in a simpler way:

    from dataclasses import dataclass
    
    @dataclass
    class Pessoa:
        nome: str
        idade: int
    

    And follow the same way:

    pessoas = []
    for _ in range(10):
        nome = input('Digite o nome da pessoa: ')
        idade = int(input('Digite agora a idade da pessoa: '))
        pessoas.append(Pessoa(nome, idade))
    
    pessoa = min(pessoas, key=lambda p: p.idade)
    
        
    15.05.2018 / 15:42
    4

    The code could be written in a slightly better way, to avoid some problems, such as when two people are the same age.

    But if you do not want to run over and get lost in school, here is an example of how it could be done:

    pessoas = []
    idades = []
    for c in range(3):
        pessoas.append(input('Digite o nome da pessoa: '))
        idades.append(int(input('Digite agora a idade da pessoa: ')))
    
    menor_idade = min(idades)         # Obtém o menor valor em 'idades'
    index = idades.index(menor_idade) # Obtém o index deste valor
    
    print(f'{pessoas[index]} é a pessoa mais nova, com {menor_idade} anos') 
    

    See working on repl.it | GitHub

    This is a naive implementation that is based on the fact that a person and his age will always be stored in the same indicia as they are inserted at the same time and the insertion is always done with the pair (name, age) complete .

    A somewhat less naive implementation would be to use a class to store a person's information:

    class Pessoa:
        def __init__(self, nome, idade):
            self.nome, self.idade, = nome, idade
    
    pessoas = []
    for c in range(3):
        nome = input('Digite o nome da pessoa: ')
        idade = int(input('Digite agora a idade da pessoa: '))
        pessoa = Pessoa(nome, idade)
        pessoas.append(pessoa)
    
    pessoa = min(pessoas, key = lambda p: p.idade)
    
    print(f'{pessoa.nome} é a pessoa mais nova, com {pessoa.idade} anos')
    

    See working on repl.it | GitHub

        
    15.05.2018 / 15:37