PythonSets

Sets

Sets (ou conjuntos) são coleções que guardam elementos únicos e não ordenados. Se você precisa garantir que não há repetição, set é a ferramenta certa.

O que diferencia um set?

CaracterísticaListaTuplaSet
Ordenada
Mutável
Permite duplicatas
Acesso por índice
# Lista — permite duplicatas, mantém ordem
lista = [1, 2, 2, 3, 3, 3]
print(lista)  # [1, 2, 2, 3, 3, 3]

# Set — sem duplicatas, sem ordem definida
conjunto = {1, 2, 2, 3, 3, 3}
print(conjunto)  # {1, 2, 3}

Criando sets

Use chaves {} ou a função set():

cores = {"vermelho", "azul", "verde"}
print(cores)  # {'azul', 'verde', 'vermelho'} (ordem pode variar)

# set() a partir de uma lista — remove duplicatas automaticamente
numeros = set([1, 2, 2, 3, 3, 3, 4])
print(numeros)  # {1, 2, 3, 4}

# set() a partir de uma string — letras únicas
letras = set("banana")
print(letras)  # {'b', 'a', 'n'}

⚠️ Atenção: {} cria um dicionário vazio, não um set! Use set() para set vazio:

vazio = {}       # ❌ dicionário
vazio = set()    # ✅ set vazio

Adicionando e removendo elementos

frutas = {"maçã", "banana"}

# Adicionar
frutas.add("laranja")
print(frutas)  # {'maçã', 'banana', 'laranja'}

# Adicionar elemento repetido — ignorado silenciosamente
frutas.add("maçã")
print(frutas)  # {'maçã', 'banana', 'laranja'} — mesma coisa

# Remover (dá erro se não existir)
frutas.remove("banana")
print(frutas)  # {'maçã', 'laranja'}

# Remover sem erro se não existir
frutas.discard("uva")  # não dá erro, mesmo não existindo

Operações matemáticas com sets

Aqui mora a verdadeira utilidade dos sets:

python = {"ana", "joão", "maria", "pedro"}
java = {"maria", "carlos", "pedro", "lucas"}

# União — todos os alunos
print(python | java)
# {'ana', 'joão', 'maria', 'pedro', 'carlos', 'lucas'}

# Interseção — alunos nas duas turmas
print(python & java)
# {'maria', 'pedro'}

# Diferença — alunos só de Python
print(python - java)
# {'ana', 'joão'}

# Diferença simétrica — alunos em uma ou outra, mas não ambas
print(python ^ java)
# {'ana', 'joão', 'carlos', 'lucas'}

Dica: | é união, & é interseção, - é diferença, ^ é diferença simétrica.

Verificando pertencimento

convidados = {"Ana", "João", "Maria", "Pedro"}

if "João" in convidados:
    print("João está na lista")  # ✅

O in em sets é muito rápido — bem mais rápido que em listas para coleções grandes.

Quando usar sets?

Remover duplicatas de uma lista

compras = ["arroz", "feijão", "arroz", "carne", "feijão", "leite"]
unicos = list(set(compras))
print(unicos)  # ['arroz', 'feijão', 'carne', 'leite'] (ordem varia)

Nota: a ordem original se perde. Se precisar manter a ordem, use um loop com if:

compras = ["arroz", "feijão", "arroz", "carne", "feijão", "leite"]
vistos = set()
unicos = []
for item in compras:
    if item not in vistos:
        unicos.append(item)
        vistos.add(item)
print(unicos)  # ['arroz', 'feijão', 'carne', 'leite'] — ordem mantida!

Verificar elementos em comum

amigos_ana = {"Carlos", "Maria", "Pedro"}
amigos_joao = {"Maria", "Lucas", "Pedro"}

amigos_em_comum = amigos_ana & amigos_joao
print(amigos_em_comum)  # {'Maria', 'Pedro'}

Erros comuns

Usar para set vazio

dados = {}          # ❌ Isso é um dicionário
print(type(dados))  # <class 'dict'>

dados = set()       # ✅ Isso é um set
print(type(dados))  # <class 'set'>

Tentar acessar por índice

cores = {"azul", "verde", "vermelho"}
print(cores[0])  # ❌ TypeError: 'set' object is not subscriptable

Solução: sets não têm ordem, então não têm índice. Converta para lista se precisar: list(cores)[0].

Adicionar tipos mutáveis ao set

dados = {[1, 2, 3]}  # ❌ TypeError: unhashable type: 'list'

Causa: sets só aceitam elementos imutáveis (números, strings, tuplas). Solução: use tupla em vez de lista: {(1, 2, 3)}.

Resumo

OperaçãoCódigoO que faz
Criar{1, 2} ou set()Cria um set
Adicionars.add(3)Adiciona elemento
Removers.remove(3)Remove (erro se não existir)
Remover seguros.discard(3)Remove sem erro
Uniãoa | bTodos os elementos
Interseçãoa & bElementos em comum
Diferençaa - bElementos só em a
Pertencimentox in sTrue se existe