Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Programa para remover APENAS uma cópia de valores duplicados de uma da lista (e não todas as duplicatas)

Escreva um método rem() que aceite como entrada uma lista contendo, possivelmente, valores duplicados, e retorne uma cópia da lista em que uma cópia de cada valor duplicado seja removida.


def rem(lista):
    i = 0
    seen = set()
    nova_lista = lista.copy()
    while i < len(lista):
        # print(lista[i])

        if lista.count(lista[i]) >= 2:

            if lista[i] not in seen:
                nova_lista.remove(lista[i])
                seen.add(lista[i])

        i += 1
        print(f"seen :{seen}, nova_lista:{nova_lista}")
    print()
    print(nova_lista)


# lista = [3,4,5,6,5,5]
lista = [4,4]
#lista = [3,4,5,6,5,5,5,6,6,3,6,4]
rem(lista)

Acho que o código acima funciona! O que acham dele?

2 respostas

Cara, fiz vários testes aqui e está de boa. Parabéns!

solução!

Olá, testei seu código e realmente funciona para o que foi proposto e acredito que seja uma boa implementação. Fiz uma modificação na minha versão para ele remover a ultima aparição invés da primeira como faz atualmente, já que o método remove do tipo list funciona desse modo. Para fazer isso utilizei o método reverse() na nova lista logo depois de copiar e no final depois de já ter removido utilizei o método novamente para as duas listas ficarem na mesma ordem. O código modificado ficou assim:

def rem(lista):
    i = 0
    seen = set()
    #nova_lista = lista.copy()
    nova_lista = lista[:]
    nova_lista_reverse = lista[:]
    nova_lista_reverse.reverse()
    while i < len(lista):
        # print(lista[i])

        if lista.count(lista[i]) >= 2:

            if lista[i] not in seen:
                nova_lista.remove(lista[i])
                nova_lista_reverse.remove(lista[i])
                seen.add(lista[i])

        i += 1
        #print(f"seen :{seen}, nova_lista:{nova_lista}")
    nova_lista_reverse.reverse()
    print(lista)
    print(nova_lista)
    print(nova_lista_reverse)


# lista = [3,4,5,6,5,5]
#lista = [4,4]
lista = [3,4,5,6,5,5,5,6,6,3,6,4]
rem(lista)

E o resultado para o ultimo exemplo ficou assim:


[3, 4, 5, 6, 5, 5, 5, 6, 6, 3, 6, 4]
[5, 5, 5, 6, 6, 3, 6, 4]
[3, 4, 5, 6, 5, 5, 6, 6]