Artigo original: Python Unique List – How to Get all the Unique Values in a List or Array

Digamos que temos uma lista contendo números duplicados:

numbers = [1, 1, 2, 3, 3, 4]

No entanto, queremos uma lista de números exclusivos.

unique_numbers = [1, 2, 3, 4]

Aqui, veremos algumas maneiras de obter uma lista de valores exclusivos em Python. Este artigo mostrará como fazer isso.

Opção 1 – Usar um set para obter os elementos exclusivos

Usar um set é uma das maneiras de se fazer isso. Um set é útil, pois ele contém apenas elementos exclusivos.

Você pode usar um set para obter os elementos exclusivos. Depois, é só transformar o set em uma lista.

Vamos agora ver duas maneiras de usar um set e uma lista. A primeira é extensa, mas é útil para vermos o que está acontecendo em cada parte da transição.

numbers = [1, 2, 2, 3, 3, 4, 5]


def get_unique_numbers(numbers):

    list_of_unique_numbers = []

    unique_numbers = set(numbers)

    for number in unique_numbers:
        list_of_unique_numbers.append(number)

    return list_of_unique_numbers


print(get_unique_numbers(numbers))
# result: [1, 2, 3, 4, 5]

Vejamos mais de perto o que está havendo. Eu recebo uma lista de números, numbers. Então, passo essa lista para a função get_unique_numbers.

Dentro da função, criarei uma lista vazia, a qual, no fim, terá apenas os números exclusivos. Em seguida, uso um set para obter os números exclusivos da lista numbers.

unique_numbers = set(numbers)

Agora, eu tenho o que precisava: os números exclusivos. Só preciso, então, colocar esses números em uma lista. Para fazer isso, uso um laço for para percorrer cada número do set.

for number in unique_numbers:
       list_of_unique_numbers.append(number)

Em cada iteração, adiciono o número atual à lista list_of_unique_numbers. Por fim, retorno essa lista ao final do programa.

Há uma maneira mais curta de usar um set e uma lista para obter os valores exclusivos em Python. É isso que veremos a seguir.

Uma abordagem mais curta com o set

Todo o código escrito no exemplo acima pode ser condensado em uma linha com ajuda das funções integradas do Python.

numbers = [1, 2, 2, 3, 3, 4, 5]
unique_numbers = list(set(numbers))
print(unique_numbers)
# Result: [1, 2, 3, 4, 5]

Embora este código pareça bem diferente do primeiro exemplo, a ideia é a mesma, usar um set para obter os números exclusivos. Em seguida, transformar o set em uma lista.

unique_numbers = list(set(numbers))

Ajuda pensar "de dentro para fora" ao ler o código acima. A parte mais interna do código é a primeira a ser avaliada: set(numbers). Depois, a parte mais externa é avaliada: list(set(numbers)).

Opção 2 – Usar a iteração para identificar valores exclusivos

A iteração é outra forma que podemos usar.

A ideia principal é criar uma lista vazia que carregue os números exclusivos. Depois, usar um laço for para iterar por cada número na lista fornecida. Se o número já estiver na lista exclusiva, continuamos para a próxima iteração. Do contrário, adicionamos o número à lista.

Vejamos duas maneiras de usar a iteração para obter os valores exclusivos em uma lista, começando por uma mais extensa.

numbers = [20, 20, 30, 30, 40]


def get_unique_numbers(numbers):
    unique = []

    for number in numbers:
        if number in unique:
            continue
        else:
            unique.append(number)
    return unique


print(get_unique_numbers(numbers))
# Result: [20, 30, 40]

Aqui veremos o que ocorre a cada passo. Primeiro, recebemos a lista de números, numbers. Passamos, então, a lista para a função get_unique_numbers.

Dentro da função, criamos uma lista vazia, unique. No fim, essa lista terá todos os números exclusivos.

Usamos um laço for para iterar por cada número na lista numbers.

 for number in numbers:
       if number in unique:
           continue
       else:
           unique.append(number)

O condicional dentro do laço verifica se o número da iteração atual já está na lista unique. Se estiver, o laço passa para a próxima iteração. Do contrário, o número é adicionado à lista.

Aqui está o ponto importante: somente os números exclusivos são adicionados. Quando o laço é concluído, retornamos unique, que contém todos os números exclusivos.

Uma abordagem mais curta com iteração

Há outra maneira de escrever a função com menos linhas.

numbers = [20, 20, 30, 30, 40]


def get_unique_numbers(numbers):
    unique = []
    for number in numbers:
        if number not in unique:
            unique.append(number)
    return unique
#Result: [20, 30, 40]

A diferença está no condicional. Desta vez, ele é definido da seguinte maneira: se o número não estiver em unique, adicione-o.

if number not in unique:
    unique.append(number)

Caso contrário, o laço passará para o próximo número na lista numbers.

O resultado é o mesmo. No entanto, às vezes é mais difícil pensar  sobre o código e lê-lo quando o booleano é negado.

Há outras formas de encontrar valores exclusivos em uma lista em Python. Você, no entanto, provavelmente acabará escolhendo uma das abordagens tratadas neste artigo.

A autora escreve sobre aprender a programar e sobre as melhores maneiras de se fazer isso em amymhaddad.com. Siga-a no Twitter: @amymhaddad.