Vectors names and ages - Python

Asked

Viewed 1,328 times

2

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

I believe 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 show now the youngest person (underage)?

2 answers

6

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 don’t want to run over things and end up getting lost in your studies, here’s 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 Index, since they are inserted at the same time and the insertion is always done with the pair (name, age) complete.

A slightly 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

5


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

  1. Search for the youngest in the age list;
  2. Find the position in the list where the minor is;
  3. Check in the list of names, in that same position, the name of the youngest person;

The code would be 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')

That’s one way raw to do, which somewhat compromises the readability of the code. In my view, the ideal is not to store two related information in different lists, but rather 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 look for the youngest person with:

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

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

To further improve, you can use the 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 on Repl.it | Github GIST

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

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

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

Python version 3.7 included the default Data Class, which can be used in this situation, much like what the LINQ put in your answer, but in a simpler way:

from dataclasses import dataclass

@dataclass
class Pessoa:
    nome: str
    idade: int

And follow in 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)
  • I didn’t know this whole f with interpolation. You are the master!

  • @LINQ Works in 3.6+

Browser other questions tagged

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