Voltar ao Glossario
Glossario Python

Set: O que É e Como Funciona | Python Brasil

Guia completo sobre sets em Python: criacao, operacoes de conjunto, metodos, frozenset e quando usar conjuntos para dados unicos e busca rapida.

O que e um Set?

Um set (conjunto) em Python e uma colecao nao ordenada de elementos unicos e hashaveis. Sets sao inspirados diretamente na teoria de conjuntos da matematica e oferecem operacoes como uniao, intersecao, diferenca e diferenca simetrica. A principal vantagem dos sets e a busca em tempo constante O(1) — verificar se um elemento pertence a um set e extremamente rapido, independente do tamanho da colecao.

Internamente, sets usam tabelas hash, a mesma estrutura que dicionarios usam para suas chaves. Por isso, os elementos de um set devem ser hashaveis (imutaveis), como numeros, strings e tuplas.

Como Criar Sets

# Com chaves
frutas = {'maca', 'banana', 'laranja'}
numeros = {1, 2, 3, 4, 5}

# A partir de iteraveis (remove duplicatas automaticamente)
lista_com_duplicatas = [1, 2, 2, 3, 3, 3, 4]
unicos = set(lista_com_duplicatas)
print(unicos)  # {1, 2, 3, 4}

# Set vazio — CUIDADO: {} cria um dicionario!
vazio = set()       # correto
nao_set = {}        # isso e um dict, nao um set!

# A partir de string
letras = set('abracadabra')
print(letras)  # {'a', 'b', 'r', 'c', 'd'}

# Set comprehension
pares = {x for x in range(20) if x % 2 == 0}
print(pares)  # {0, 2, 4, 6, 8, 10, 12, 14, 16, 18}

Operacoes de Conjunto

As operacoes matematicas de conjuntos sao o diferencial dos sets.

python_devs = {'Ana', 'Bruno', 'Carla', 'Diego'}
java_devs = {'Bruno', 'Eva', 'Diego', 'Felipe'}

# Uniao — todos os elementos de ambos
print(python_devs | java_devs)
# {'Ana', 'Bruno', 'Carla', 'Diego', 'Eva', 'Felipe'}
print(python_devs.union(java_devs))  # equivalente

# Intersecao — elementos em comum
print(python_devs & java_devs)
# {'Bruno', 'Diego'}
print(python_devs.intersection(java_devs))

# Diferenca — elementos que estao em um mas nao no outro
print(python_devs - java_devs)
# {'Ana', 'Carla'}
print(python_devs.difference(java_devs))

# Diferenca simetrica — elementos que estao em um OU outro, mas nao em ambos
print(python_devs ^ java_devs)
# {'Ana', 'Carla', 'Eva', 'Felipe'}
print(python_devs.symmetric_difference(java_devs))

Metodos de Verificacao

a = {1, 2, 3}
b = {1, 2, 3, 4, 5}
c = {6, 7}

# Subconjunto
print(a.issubset(b))     # True — a esta contido em b
print(a <= b)             # True — operador equivalente

# Superconjunto
print(b.issuperset(a))   # True — b contem a
print(b >= a)             # True

# Conjuntos disjuntos (nenhum elemento em comum)
print(a.isdisjoint(c))   # True
print(a.isdisjoint(b))   # False

Metodos de Modificacao

cores = {'vermelho', 'azul', 'verde'}

# Adicionar elemento
cores.add('amarelo')
print(cores)  # {'vermelho', 'azul', 'verde', 'amarelo'}

# Adicionar multiplos elementos
cores.update(['roxo', 'laranja'])
print(cores)

# Remover elemento (gera erro se nao existir)
cores.remove('roxo')
# cores.remove('preto')  # KeyError!

# Remover elemento (sem erro se nao existir)
cores.discard('preto')  # nenhum erro

# Remover e retornar elemento arbitrario
elemento = cores.pop()
print(f'Removido: {elemento}')

# Limpar o set
cores.clear()

# Operacoes de atualizacao in-place
a = {1, 2, 3, 4}
b = {3, 4, 5, 6}

a |= b            # uniao in-place
a &= b            # intersecao in-place
a -= b            # diferenca in-place
a ^= b            # diferenca simetrica in-place

# Metodos equivalentes
a.update(b)
a.intersection_update(b)
a.difference_update(b)
a.symmetric_difference_update(b)

Frozenset

Um frozenset e a versao imutavel de um set. Por ser imutavel (e portanto hashavel), pode ser usado como chave de dicionario ou como elemento de outro set.

# Criando frozenset
imutavel = frozenset([1, 2, 3, 4])

# Operacoes de leitura funcionam normalmente
print(3 in imutavel)          # True
print(imutavel | {5, 6})      # frozenset({1, 2, 3, 4, 5, 6})
print(imutavel & {2, 3, 5})   # frozenset({2, 3})

# Operacoes de escrita NAO funcionam
# imutavel.add(5)  # AttributeError

# Usando frozenset como chave de dicionario
permissoes = {
    frozenset({'ler', 'escrever'}): 'editor',
    frozenset({'ler'}): 'leitor',
    frozenset({'ler', 'escrever', 'admin'}): 'administrador',
}

Casos de Uso Praticos

# Remover duplicatas preservando a ordem (Python 3.7+)
def remover_duplicatas(itens):
    vistos = set()
    resultado = []
    for item in itens:
        if item not in vistos:
            vistos.add(item)
            resultado.append(item)
    return resultado

dados = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3]
print(remover_duplicatas(dados))  # [3, 1, 4, 5, 9, 2, 6]

# Verificacao rapida de pertinencia
palavras_proibidas = {'spam', 'phishing', 'malware', 'virus'}

def verificar_mensagem(texto):
    palavras = set(texto.lower().split())
    encontradas = palavras & palavras_proibidas
    if encontradas:
        print(f'Palavras suspeitas: {encontradas}')
        return False
    return True

# Encontrar elementos comuns entre colecoes
alunos_mat = {'Ana', 'Bruno', 'Carla', 'Diego'}
alunos_fis = {'Bruno', 'Diego', 'Eva', 'Felipe'}
alunos_qui = {'Carla', 'Diego', 'Felipe', 'Gabi'}

# Alunos em todas as materias
em_todas = alunos_mat & alunos_fis & alunos_qui
print(em_todas)  # {'Diego'}

Erros Comuns

O erro mais frequente e tentar criar um set vazio com {}, que na verdade cria um dicionario. Use set() para sets vazios. Outro erro e tentar adicionar elementos mutaveis como listas ou dicionarios a um set — apenas objetos hashaveis sao permitidos. Tambem e comum esquecer que sets nao possuem ordem definida, tornando impossivel acessar elementos por indice.

Boas Praticas

Use sets quando precisar de elementos unicos e busca rapida por pertinencia. Prefira operadores (|, &, -, ^) para operacoes de conjunto entre sets, e metodos (union, intersection) quando trabalhar com iteraveis mistos. Use frozenset quando precisar de um conjunto imutavel, especialmente como chave de dicionario. Para remover duplicatas de uma lista quando a ordem importa, use a tecnica com set auxiliar em vez de simplesmente converter para set e de volta para lista.

Quando Usar

Sets sao ideais para verificar pertinencia de elementos, eliminar duplicatas, e realizar operacoes de teoria de conjuntos. Se voce precisa verificar frequentemente se um valor existe em uma colecao, um set sera drasticamente mais rapido que uma lista para colecoes grandes.