4) O arquivo consumidores.txt armazena, em cada linha, o nome completo (nome e sobrenome) e a idade de um consumidor de um tipo de biscoito. Esses dados estão separados por vírgula (‘,’).
a) Escreva uma função, chamada geraLista, que:
● Receba o nome desse arquivo (consumidores.txt);
● Retorne uma lista de listas, em que cada lista interna armazena um nome (apenas o nome, sem o sobrenome) e a quantidade de ocorrências desse nome no arquivo.
b) Escreva um programa para testar a função geraLista.
Exemplo:
Arquivo consumidores.txt
Lili Patinhas,12
Lele Patinhas,12
Lala Patinhas,12
Lulu Patinhas,13
Lulu Caldas,35
Dudu Caldas,37
Mari Marinha,45
Pedro Marinha,54
Dudu Marinha,65
Pedro Marinha,12
Lala Marinha,6
Kiko Patinhas,30
Kika Cardosin,23
Lele Cardosin,32
Dudu Cardosin,99
Lista retornada: [ ['Lili', 1], ['Lele', 2], ['Lala', 2], ['Lulu', 2], ['Dudu', 3], ['Mari', 1], ['Pedro', 2], ['Kiko', 1], ['Kika', 1] ]
Passo 1
E aí, chefe! Mano, a questão dá um monte de coisa, mas na verdade só tá pedindo pra gente contar as ocorrências dos primeiros nomes… A gente nem usa as idades pra nada, percebeu?! Em prova, os professores fazem questão com textão achando que vai desmotivar nós HAHAHHA e desmotiva mesmo.
Mas ok, vamos começar a fazer nosso programa. Cara, eu vou criar o arquivo consumidores.txt com os mesmos dados do professor porque eu consigo copiar e colar, mas eu tô ligado que você não vai conseguir copiar do enunciado daí… Então, cria esse arquivo e inventa uns nomes você mesmo, jae?!
Primeiramente, bora construir nossa função, com o nome que o enunciado forneceu...
Essa função tem que fazer todo o processo de leitura e processamento da lista, e retornar essa lista no fim, igual tá no exemplo do enunciado… O parâmetro recebido pela função é o nome do arquivo. Então, bora abrir esse arquivo!
Como a gente só vai ler, a gente pode pedir permissão só de leitura… Justo, né?!
E agora, vamos montar nossa estrutura de repetição que vai ler, linha por linha, o arquivo...
Show! Agora a gente já começa a precisar pensar em como vamos armazenar nossos dados…
Passo 2
Pô, existem várias formas da gente fazer essa parada, mas eu gosto de uma abordagem: fazer a lista linear e depois transformar em uma lista de sublistas… Tipo assim:
A vantagem de trabalhar com a lista linear é que a gente consegue usar os métodos index() e o operador in… Pra construir a lista direto no formato que o enunciado pediu, com sublistas, a gente precisaria criar funções próprias de busca e index. Eu prefiro o que dá menos trabalho!
Então, vamos começar criando a lista que a gente vai usar. E vamos criar ela fora do loop, ok?
Criei a lista com nome de r (de “resultado”). Agora, a cada linha a gente verifica se o nome já tá na lista. Se já tiver a gente incrementa o index do nome +1, se não, a gente adiciona!
Mas primeiro, precisamos extrair o primeiro nome dessa linha… A gente poderia usar o split(‘ ‘) pra isso, porque o nome vai estar sempre antes do primeiro espaço. Não precisamos nos preocupar com a vírgula e nem com o “\n”, afinal, a gente só quer o nome…
O resto da lista fica toda cagada, mas o nome funciona e a gente só precisa do nome… Então, tá ótimo!
Então, vamos salvar o nome numa variável…
Eu criei essa variável com nome de “c” (de “consumidor”). Mas cara, eu só tô usando letras pros nomes porque quero economizar espaço na sua tela, beleza?! Seu professor vai gostar muito mais se você escolher um nome mais autoexplicativo!
E agora vamos fazer a mágica pra contar… Se não existir o nome na lista, adicionamos esse nome e em seguida o número de ocorrência, que começa em 1.
Porém, se o nome já existir, a gente precisa atualizar a contagem pra incrementar +1…
Sacou? A gente tá armazenando as ocorrências de cada nome 1 índice na frente do nome. Então a gente pega o índice do nome, soma 1 e aí a gente vai chegar no número de ocorrências. Depois, a gente incrementa esse número! Pronto… Depois desse for a gente não precisa mais do arquivo, então podemos fechar ele!
Passo 3
Agora a gente já vai ter aquela lista linear, mas precisamos converter pro formato que o professor quer. E, pra isso, a gente pode usar uma técnica sagaz… Olha essa ilustração:
Viu? A gente pode adicionar no fim da lista uma sublista com os dois primeiros elementos, e depois remover esses dois primeiros da lista! Vamo escrever isso lá:
Pronto… A gente adicionou no fim da lista os dois primeiros elementos e depois deletamos eles do início! Só que a gente só fez isso uma vez, e não sabemos quantas vezes precisaremos repetir esse processo… Mas a gente sabe que precisamos repetir até não sobrar nenhum elementos fora de sublista.
Então, vamos repetir esse código até o primeiro elemento ser uma sublista!
Pronto! Agora, o processo vai se repetir até todos os nomes estarem dentro de subslistas… Só precisamos não esquecer que a gente não precisa fazer nada disso se a lista estiver vazia! Então, a gente quer repetir o processo enquanto a lista não for vazia e o primeiro elemento não for uma sublista!
Agora sim! Só precisamos retornar a lista r no final de tudo.
Vamos fazer o programa pra testar, agora...
Passo 4
Cara, nosso programa pra testar é basicamente chamar a função e ver se sai tudo como o esperado. Pra isso, vou usar a função print() pra exibir o resultado da função.
E quando executamos esse programa, o resultado foi exatamente como o esperado (no meu caso, igual ao do enunciado).
Te vejo no próximo exercício, doido! É nósss!