Glossário Python

Set: O que É e Como Funciona

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.

Conteúdo relacionado