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.