method overload sort

2

Studying polymorphism in python. I'm trying to overload the sort method of the class list that was inherited by my class group. It turns out that the planning is not working out right. I do not think the problem is the sort algorithm. It has to sort by increasing 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)
    
asked by anonymous 09.10.2017 / 15:12

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)

Following 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)

Output:

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
    
09.10.2017 / 16:00