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

Programa para remover APENAS uma cópia de valores duplicados de uma da lista

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.

O que eu fiz:

def rem(lista):
    i = 0
    while i <= len(lista):
        # print(lista[i])
        if lista.count(i) >= 2:
            lista.remove(i)
        i += 1
    print(lista)

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

O código funciona para a lista

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

mas não para

[4,4]

O que fiz de errado?

Exemplo de saída:

   rem([2, 4, 2, 4, 4])
    [2, 4, 4]
3 respostas
solução!

O problema está na linha abaixo:

lista.remove(i)

Quando você pede para remover o i está removendo um valor, que por coincidência, tem o mesmo valor do índice e não o valor em si. Traduzindo, quando vc coloca lista.remove(i) quando esse índice é igual a 3 você estará removendo o valor 3 (incorreto) e não o valor 6 (correto). Por isso, para acessar o valor a ser removido você precisa colocar lista[i] como parâmetro da função remove.

Segue o código (corrigido) que usei para fazer o teste no Spyder:

def rem(lista):
    """

    Parameters
    ----------
    lista : LIST
        Recebe uma lista de valores inteiros.

    Returns
    -------
    resultado : LIST
        Retorna uma lista de valores inteiros não repetidos.

    """

   def rem(lista):

    i = 0

    resultado = []

    while i < len(lista):

        if lista[i] not in resultado:
            resultado.append(lista[i])

        i = i + 1

    return sorted(resultado)

Usei essas listas de teste:

lista = [1,2,3,4,6,5,4,6,7,8,5,5,3,0,0]
print(rem(lista))

lista = [4,4]
print(rem(lista))

lista = [1,1,1,2,3,4,6,5,4,7,8,6,5,5,3]
print(rem(lista))

lista = [1,2,3,4,6,5,4,4,4,7,8,6,5,5,3]
print(rem(lista))

lista = [1,2,3,4,6,5,7,8]
print(rem(lista))

Respostas:

[0, 1, 2, 3, 4, 5, 6, 7, 8]
[4]
[1, 2, 3, 4, 5, 6, 7, 8]
[1, 2, 3, 4, 5, 6, 7, 8]
[1, 2, 3, 4, 5, 6, 7, 8]

PS: Precisei fazer uma correção. Ele estava removendo os itens conforme descrito da primeira vez, mas se perdia em alguns exemplos. Coloquei algumas listas para teste também.

@Ronald Bolsoni Falcão: Obrigado! Na verdade o programa deveria remover APENAS 1 cópia e não todas!

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 acha dele?