Um set é uma sacola não ordenada de itens únicos
Onde listas e tuplas se importam com ordem, sets não. Onde listas deixam duplicatas se acumularem, sets silenciosamente descartam. O set é a estrutura de dados certa quando você tem duas necessidades específicas:
- Quer itens únicos, ponto final.
- Quer checar pertinência rápido.
Escreva um com chaves:
O "red" e "green" duplicados no segundo set simplesmente somem. Isso não é erro — é o ponto todo.
Criando sets
As duas formas que você vai usar de fato:
Esse último ponto pega todo mundo uma vez: {} cria um dicionário vazio, não um set vazio. A ambiguidade sintática tinha que cair sobre um dos dois, e os dicts venceram.
Adicionando e removendo
remove vs discard é a distinção-chave: remove insiste que o item esteja presente; discard não liga. Escolha com base em se a ausência do item deve ser erro.
Pertinência rápida
É aqui que sets realmente ganham seu lugar. x in algum_set roda em tempo constante, não importa quão grande o set seja. x in alguma_lista tem que caminhar pela lista, o que fica lento quando a lista é grande.
Regra prática: qualquer hora que você se pegar escrevendo if x in alguma_lista dentro de um laço, e a lista tem mais de algumas dezenas de itens, converta a lista em set antes.
Matemática de sets
É aqui que sets ficam realmente divertidos. Você pode combinar eles com operadores que espelham operações matemáticas de conjuntos:
Cada operador também tem uma forma de método (.union(), .intersection(), .difference(), .symmetric_difference()). Os operadores são mais compactos; as formas de método aceitam qualquer iterável, não só outro set.
Deduplicando uma lista
Um dos usos mais comuns de sets, mesmo fora da "lógica de sets":
Uma linha, duplicatas sumidas. Uma coisa para notar: a ordem não é preservada. Se você precisa de unicidade e da ordem original, use dict.fromkeys():
Dicts preservam a ordem de inserção no Python moderno, e dict.fromkeys constrói um usando os itens do iterável como chaves — efetivamente um set ordenado.
Subconjuntos e superconjuntos
Checando se um set está contido em outro:
Aparecem em coisas como checagens de permissão ("este usuário tem todas as roles requeridas?").
O que pode entrar num set
Só itens hashable. Esse é um termo técnico — na prática significa:
- Coisas imutáveis são hashable: números, strings, tuplas de hashables, frozensets.
- Coisas mutáveis não são: listas, dicts, outros sets não podem ser membros de set.
Se precisa de um set de sets, use frozenset — é uma versão imutável de set.
Iteração é não ordenada
Percorrer um set te dá itens em nenhuma ordem garantida:
Rode isso algumas vezes e você vai ver a ordem variar. Se ordem importa, set não é a estrutura certa — ordene o conteúdo quando precisar, ou use uma lista.
Quando não usar um set
Se qualquer uma destas é verdadeira, lista ou dict provavelmente encaixa melhor:
- Você se importa com ordem.
- Você precisa guardar duplicatas.
- Cada item tem dados associados (use um dict com o item como chave).
Seguindo em frente
Sets lidam com unicidade e pertinência. Dicionários — a seguir — lidam com o padrão mais amplo "buscar um valor por uma chave", que é provavelmente a estrutura de dados não lista mais útil em Python.
Perguntas frequentes
O que é um set em Python?
Um set é uma coleção não ordenada de itens únicos. Sets usam chaves sem pares chave-valor: cores = {'red', 'green', 'blue'}. Adicionar o mesmo valor duas vezes não faz nada — duplicatas são silenciosamente descartadas.
Quando devo usar um set em vez de uma lista?
Use um set quando se importa com unicidade ou quando vai fazer muitas checagens de pertinência (x in colecao). Sets removem duplicatas automaticamente e checam pertinência em tempo constante, o que para coleções grandes é uma aceleração enorme em relação a listas.
Como crio um set vazio em Python?
Use set(), não {} — chaves vazias criam um dicionário vazio, não um set vazio. Uma vez que você tem um set, pode adicionar itens com .add(valor).