Overload of the Sort method

Asked

Viewed 112 times

2

Studying polymorphism in python. I am trying to overload the Sort method of the list class that was inherited by my group class. It turns out that the ordering is not coming out right. I don’t think the problem is the ordering algorithm. He has to sort ascendantly by age, but the exit after Sort looks like this:

Nome: Ana || Idade: 13
Nome: Ana || Idade: 13
Nome: Maria || Idade: 45

Code:

class Grupo(list):
    def __init__(self):
        self.pessoas=Pessoa()
    def __str__(self): #sobrecarga do método print. Irá printar os dados de todas as pessoas do grupo
        str=""
        for pessoa in self.pessoas: #percorre a lista e vai adicionando os dados das pessoas há uma string única
            str+="\nNome: %s || Idade: %d"%(pessoa.nome,pessoa.idade)
        return str #retorna a string

    def sort(self):
        copia = self.pessoas.copy()
        tamanho = len(self.pessoas)
        self.pessoas.clear()
        while len(self.pessoas) < tamanho:
            min=copia[0]
            for pessoa in copia:
                if pessoa.idade < min.idade:
                    min = pessoa
            copia.remove(min)
            self.pessoas.append(min)

class Pessoa:
    def __init__(self, nome=None, idade=None):
        self.nome = nome
        self.idade = idade


pedro = Pessoa("Pedro", 23)
ana = Pessoa("Ana", 13)
maria = Pessoa("Maria", 45)
grupo = Grupo()
grupo.pessoas = [pedro, ana, maria]
print(grupo)
grupo.sort()
print(grupo)

1 answer

1


Use the Slice Notation to copy and clean your list self.pessoas:

def sort(self):
    copia = self.pessoas[:]
    tamanho = len(self.pessoas)
    self.pessoas[:] = []
    while len(self.pessoas) < tamanho:
        min=copia[0]
        for pessoa in copia:
            if pessoa.idade < min.idade:
                min = pessoa
        copia.remove(min)
        self.pessoas.append(min)

Follows corrected and improved code:

class Grupo(list):
    def __init__(self):
        self.pessoas = []

    def __str__(self):
        str=""
        for pessoa in self.pessoas:
            str += "\nNome: %s || Idade: %d" % (pessoa.nome, pessoa.idade )
        return str

    def append( self, pessoa ):
        self.pessoas.append(pessoa)

    def sort(self,reverse=False):
        cp = self.pessoas[:]  # Slice Notation para copiar lista
        tam = len(cp)
        self.pessoas[:] = [] # Slice Notation para limpar lista
        while len(self.pessoas) < tam:
            x = cp[0]
            for p in cp:
                if reverse == False:
                    if p.idade < x.idade:  # Verifica se idade eh MENOR
                        x = p
                else:
                    if p.idade > x.idade: # Verifica se idade eh MAIOR
                        x = p
            cp.remove(x)
            self.pessoas.append(x)

class Pessoa:
    def __init__(self, nome=None, idade=None):
        self.nome = nome
        self.idade = idade

# Cria Grupo
grupo = Grupo()

# Adiciona Pessoas no Grupo
grupo.append( Pessoa("Pedro", 23) )
grupo.append( Pessoa("Ana", 13) )
grupo.append( Pessoa("Maria", 45 ) )
grupo.append( Pessoa("Joana", 9 ) )
grupo.append( Pessoa("Jesus", 33 ) )
grupo.append( Pessoa("Maria", 27 ) )

print(grupo)

# Ordena Pessoas do Grupo pela idade de forma Crescente
grupo.sort()
print(grupo)

# Ordena Pessoas do Grupo pela idade de forma Decrescente
grupo.sort(reverse=True)
print(grupo)

Exit:

Nome: Pedro || Idade: 23
Nome: Ana || Idade: 13
Nome: Maria || Idade: 45
Nome: Joana || Idade: 9
Nome: Jesus || Idade: 33
Nome: Maria || Idade: 27

Nome: Joana || Idade: 9
Nome: Ana || Idade: 13
Nome: Pedro || Idade: 23
Nome: Maria || Idade: 27
Nome: Jesus || Idade: 33
Nome: Maria || Idade: 45

Nome: Maria || Idade: 45
Nome: Jesus || Idade: 33
Nome: Maria || Idade: 27
Nome: Pedro || Idade: 23
Nome: Ana || Idade: 13
Nome: Joana || Idade: 9

Browser other questions tagged

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