Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

Solucionado
(ver solução)
3
respostas

Resolução de Atividades - 10 Corrigindo posições na lista de uma corrida de atletismo (PARTE 1)

PARTE 1


Exercicio-N7\models\componentes.py


class Componente:

    """ Classe que representa um componente de uma equipe """

    def __init__ (self, nome = ""):

        """
        Contrutor da Classe
        
        Parâmetros:
        - Nome: String
        """

        self.nome = nome

Exercicio-N7\models\equipe.py


from models.repositorio_equipes import Repositorio_Equipes
from models.componentes import Componente

class Equipe:

    """ Classe que representa uma equipe em uma competição """

    def __init__ (self, nome = ""):

        """
        Contrutor da Classe
        
        Parâmetros:
        - Nome: String
        - Componentes: List[Componente]
        """

        self.nome = nome
        self.componentes = []

Exercicio-N7\models\repositorio_equipes.py


class Repositorio_Equipes:

    """ Classe que contém a lista de equipes e métodos para a sua edição """

    lista_equipes = []

    @classmethod

    def adicionar_equipe (cls, equipe):

        """ 
        Adiciona uma equipe à lista. 
        
        Parâmetros:
        
        Equipe: objeto da classe Equipe a ser adicionado.
        """

        cls.lista_equipes.append (equipe)

    @classmethod

    def remover_equipe (cls, equipe):

        """
        Remove uma equipe da lista de equipes. 
        
        Parâmetro:
        
        Equipe: objeto da classe Equipe a ser removido.
        """

        cls.lista_equipes.remove (equipe)

    @classmethod 

    def buscar_equipe_por_nome (cls, nome_equipe):

        """
        Busca uma equipe na lista com base no seu nome.
        
        Parâmetro:
        
        Nome: str.
        """

        for equipe in cls.lista_equipes:

            if equipe.nome == nome_equipe:

                return equipe

        return None
    
    @classmethod

    def exibir_lista_equipes (cls):

        """ Exibe a lista de equipes com cada componente """

        if len(cls.lista_equipes) == 0:

            print ("\nNão há equipes na lista.")

        else:

            print ("\nLista de equipes")

        for index, equipe_iterador in enumerate(cls.lista_equipes, 1):
            
            print (f"Equipe Nº{index}: {equipe_iterador.nome}")

            if len (equipe_iterador.componentes) == 0:

                print ("  Esta equipe não possui integrantes cadastrados.")

            else: 
                
                for index_componente, componente_iterador in enumerate(equipe_iterador.componentes, 1):

                    print (f"  Componente Nº{index_componente}: {componente_iterador.nome}")
3 respostas
solução!

Oi, Victor. Tudo bem com você?

Obrigado por compartilhar sua solução. É interessante observar que você expandiu a proposta da atividade e optou por desenvolver uma estrutura orientada a objetos, criando classes para representar componentes, equipes e um repositório responsável pelo gerenciamento dos dados. Essa abordagem demonstra iniciativa para praticar conceitos além do objetivo inicial do exercício, explorando organização de código, encapsulamento de responsabilidades e reutilização de classes.

A separação entre Componente, Equipe e Repositorio_Equipes facilita a manutenção do projeto e torna o código mais escalável. Como exemplo, caso futuramente seja necessário incluir informações como categoria da equipe ou número de inscrição dos participantes, essa estrutura permitirá adicionar novos atributos e métodos sem grandes alterações nas demais classes. Uma sugestão para evolução é considerar armazenar a lista de equipes como atributo de instância em vez de atributo de classe, dependendo da necessidade do projeto, principalmente se houver mais de um repositório independente.

Fiquei curioso para ver a continuação da implementação. Como você pretende realizar a busca pelo nome incorreto e efetuar a substituição pelo nome correto utilizando essa estrutura orientada a objetos?

Parabéns pelo trabalho e por explorar uma solução mais elaborada. Continue compartilhando suas implementações. O fórum está à disposição para acompanhar sua evolução.

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!

Boa tarde!

Obrigado pelo elogio, me deixa bastante feliz saber que estou conseguindo progredir e produzir aplicações avançadas e complexas. Mas eu percebi que estava exagerando muito nas soluções Esssa abordagens exigem bastante tempo em um problema que pede somente para implementar funções em listas e tuplas. Eu estava criando um aplicativo para resolver um problema de Tupla, entende? Então eu já decidi que nos próximos exercícios eu tentarei criar apenas o que é exigido, acredito que ficaria melhor para o meu aprendizado (e para a correção dos senhores também ksksk.)

Bem, respondendo ao senhor, eu pensei que para procurar um nome incompleto, com o conhecimento que eu atualmente tenho, eu tentaria separar o nome que o usuário enviou em uma lista, utilizando a função .splice(). Separada a lista, eu iria comparar essa lista contendo as letras do usuario_nome (variável que armazena essa lista) com cada nome da lista de equipes usando o laço for. A cada letra certa, eu adicionaria um hit_rate, que quanto maior o número, então maior as chances de ser aquela equipe. Então:

for equipe_iteradora in lista_equipe:

    for letra_iteradora in equipe_iteradora.splice():
    
            if letra_iteradora in usuario_nome:
            
                hit_rate += 1

Depois multiplica o hit_rate por 100 e dividiria pelo len (usuario_nome), contendo a probabilidade de ser aquela palavra. Se der mais que 70%, é perguntado ao usuário se ele queria escrever tal equipe.

Eu sei, ficou um pouco bagunçado, não sei se expliquei muito bem a lógica. Eu tentaria desse modo.

Oi, Victor.

Sua ideia de calcular um percentual de similaridade já mostra raciocínio de comparação aproximada de strings, o que é ótimo para pensar no problema. Só alguns ajustes: em Python não existe .splice() (isso é JavaScript) para separar uma string em letras use list(nome_equipe) ou simplesmente itere direto sobre a string, já que strings em Python já são iteráveis caractere a caractere. Também vale usar .lower() nos dois nomes antes de comparar, para a busca não falhar por causa de maiúsculas e minúsculas. A lógica do hit_rate está válida, é só ajustar a sintaxe para Python.