Removendo itens duplicados de uma lista de dicionários. (Python)

Neste post, mostro como remover itens duplicados de uma lista de dicionários de duas formas.

Antes de começar, é bom lembrar que o Python considera dois dicionários como iguais se eles possuírem as mesmas propriedades e os mesmos valores, independente da ordem das propriedades.

Exemplo:

>>> {"a":42, "b": "foo"} == {"b": "foo", "a": 42}
True

 

Para as duas formas, considere a variável e a lista abaixo:

list_with_duplicates = [
    {"foo": 42, "bar": "bacon", "age": 100, "need_food": True},
    {"foo": 42, "bar": "bacon", "age": 100, "need_food": True},
    {"foo": 20, "bar": "bacon", "age": 50, "need_food": True}
]

Nesta lista, os dois primeiros itens são iguais e o último é diferente.

 

Forma 1: Básica.

unique_list = list()
for i in range(len(list_with_duplicates)):
    if list_with_duplicates[i] not in list_with_duplicates[i + 1:]:
        unique_list.append(list_with_duplicates[i])


for unique_result in unique_list:
    print(unique_result)

O que acontece no código acima é o seguinte:

  1. Criei uma lista que vai receber os dicionários únicos (unique_list).
  2. Para preencher esta lista, faço um loop com a quantidade de elementos que existem na lista geral com os elementos (for i in range(len(list_with_duplicates)):)
    1. Também seria possível utilizar o enumerate(list_with_duplicates).
  3. Dentro deste loop, verifico que se o elemento atual (list_with_duplicates[i]) não está dentro da lista a partir da posição adjacente (not in list_with_duplicates[i + 1:]).
  4. Se não estiver, então o valor é único e eu o adiciono na lista unique_list.

 

Forma 2: Usando list comprehension

unique_list = [i for n, i in enumerate(list_with_duplicates) if i not in list_with_duplicates[n + 1:]]

for unique_result in unique_list:
    print(unique_result)

Nesta segunda forma, fiz exatamente a mesma coisa da primeira forma, mas utilizando list comprehension.

  1. i for n, i in enumerate(list_with_duplicates): Neste pedaço do código, a variável n indica o índice do elemento que está sendo utilizado, enquanto i representa o item em si.
  2. if i not in list_with_duplicates[n + 1:]: Agora verificamos se o item sendo analisado existe nas posições adjacentes da lista.

 

Criei um arquivo no meu Github com este exemplo.

 

 

Espero ter ajudado!

 

The following two tabs change content below.
Arquiteto de Software e Desenvolvedor Backend (quase Fullstack), geralmente trabalho com C#, PowerShell, Python, Golang, bash e Unity (esse é mais por hobby). Estou sempre buscando algo novo para aprender, adicionando novas ferramentas ao meu cinto de utilidades.
Posted in Dev, Python and tagged , , , , .