Curso de Python / Conjuntos: elementos únicos e operações entre coleções

Um conjunto, representado por set, armazena elementos únicos e permite testar presença e comparar coleções. Converter dados para um conjunto elimina a quantidade de repetições e a informação de posição; faça isso somente quando essas informações puderem ser descartadas.

Crie conjuntos e interprete as operações

Um conjunto não vazio pode ser escrito como {"food", "books"}. Para um conjunto vazio, use set(): as chaves vazias {} criam um dicionário. Os elementos precisam ser hashable, como as chaves de um dicionário; listas e dicionários não podem ser elementos diretamente.

Um conjunto não oferece acesso por índice nem uma ordem de inserção que você possa usar como regra de apresentação. Não interprete a posição de um elemento na saída como a posição que ele tinha nos dados. A referência dos tipos de conjunto descreve essas propriedades.

Expressão Significado
a | b União: elementos presentes em pelo menos um dos conjuntos
a & b Interseção: elementos presentes nos dois
a - b Diferença: elementos de a que não estão em b
a ^ b Diferença simétrica: elementos presentes em exatamente um dos conjuntos

A direção importa na diferença: a - b e b - a podem produzir resultados distintos. Escolha primeiro qual coleção contém os dados observados e qual representa a regra ou lista permitida.

Compare categorias usadas e permitidas

Salve o programa completo abaixo em UTF-8 como sets.py, na pasta do projeto, e execute python sets.py no ambiente selecionado. No macOS ou Ubuntu, fora de um ambiente virtual, use python3 se esse for o comando do interpretador. Não são necessários pacotes ou arquivos adicionais.

used = {"food", "transport", "food"}
allowed = {"food", "books"}
print(sorted(used))
print(sorted(used & allowed))
print(sorted(used - allowed))
used.discard("missing")
print("food" in used)

A saída esperada é:

['food', 'transport']
['food']
['transport']
True

O valor food aparece duas vezes no literal de used, mas representa apenas um elemento no conjunto. A interseção encontra food, que aparece tanto nas categorias usadas quanto nas permitidas. A diferença used - allowed encontra transport, uma categoria usada que não está na lista permitida.

sorted() produz uma lista ordenada para que a apresentação dos resultados seja previsível. Ele não transforma o conjunto original em uma coleção ordenada. "food" in used testa a presença e retorna True. A chamada discard("missing") não altera o conjunto porque esse elemento já estava ausente.

Diferencie eliminar repetições de validar registros

Conjuntos são adequados para testar categorias, identificar elementos desconhecidos e comparar grupos. Eles não preservam quantas vezes cada valor apareceu. Para eliminar repetições de itens hashable mantendo a ordem da primeira ocorrência, uma opção é list(dict.fromkeys(items)). Por exemplo, com items = ["food", "books", "food"], o resultado é ["food", "books"]. A operação também perde a contagem de repetições.

Uma duplicata de valor não é necessariamente um registro duplicado. Duas despesas distintas de 8000 têm soma 16000. Ao colocar os valores em um conjunto, resta apenas 8000, e somá-lo já não representa as duas despesas. Verifique identificadores de transação quando o objetivo for detectar registros repetidos e defina se um identificador repetido deve ser rejeitado ou atualizar um registro.

A aula de dicionários e chaves ajuda a distinguir uma chave de identificação de um valor armazenado. Antes de eliminar repetições, decida se elas são erros, ocorrências legítimas ou dados que precisam ser contados. Uma limpeza que remove informação pode esconder o problema que você pretendia validar.

Escolha a regra de remoção e teste as mudanças

remove() provoca KeyError quando o elemento não existe; discard() aceita a ausência. Use a primeira opção quando a ausência indicar uma condição inesperada e a segunda quando remover um item opcional for uma operação válida. O tutorial oficial de conjuntos apresenta a aplicação das operações em coleções.

  1. No programa completo, acrescente used.add("food") depois das duas definições iniciais e antes do primeiro print(). Confira que a saída e a quantidade de elementos não mudam: used continua tendo dois elementos.
  2. Troque apenas a linha acrescentada por used.add("books"). A primeira linha passa a mostrar ['books', 'food', 'transport'], e a interseção passa a mostrar ['books', 'food']. A diferença ainda contém transport.
  3. Remova a linha acrescentada e confirme novamente as quatro linhas de saída originais.

Escolha uma lista quando a ordem e as repetições forem importantes, uma tupla para um registro posicional curto, um dicionário para consultas por chave e um conjunto para unicidade e presença. A estrutura adequada depende da informação que o programa precisa preservar.