Como manipular um conjunto em Python
Nesta lição, vamos aprender como realizar algumas ações, como adicionar e remover itens dos nossos conjuntos. Também vamos conhecer uma outra versão deles, o frozenset.
Como conjuntos não têm índices e não mantêm ordem, não é possível alterar diretamente um valor específico dentro deles através de operações como fazíamos com listas e tuplas:
1lista = ["item1", "item2"] 2conjunto = {"item1", "item 2"} 3
Sempre que falamos em "alterar" um conjunto, estamos na verdade falando sobre adicionar um novo item ou remover um item existente e não sobre mudar um de seus elementos.
Conjuntos são mutáveis, então é possível acrescentar novos valores depois que eles são criados.
add()Adiciona um único valor ao conjunto.
1frutas = {"maçã", "banana"} 2 3frutas.add("laranja") 4print(frutas) 5 6# Saída possível: 7# {'banana', 'laranja', 'maçã'}
Se o valor já existir no conjunto, nada muda, já que os conjuntos não aceitam duplicados.
update()Adiciona vários valores de uma vez ao conjunto. Ele pode receber uma coleção, como o outro conjunto ou uma lista, por exemplo.
1frutas = {"maçã", "banana"} 2 3citricas = {"laranja", "limão"} 4frutas.update(citricas) 5 6print(frutas) 7 8vermelhas = ["morango", "cereja"] 9frutas.update(vermelhas) 10 11print(frutas) 12 13# Saída possível: 14# {'banana', 'maçã', 'limão', 'laranja'} 15# {'banana', 'maçã', 'limão', 'laranja', 'morango', 'cereja'}
Cada método de remoção tem um comportamento diferente, principalmente quando o item que queremos remover não existe.
remove()Remove o item se ele existir. Senão, um erro é gerado.
1frutas = {"maçã", "banana", "laranja"} 2frutas.remove("banana") 3 4print(frutas) 5 6frutas.remove("melão") # "melão" não existe em frutas, gera erro 7 8# Saída possível: 9# {'laranja', 'maçã'} 10# Traceback (most recent call last): 11# File "<stdin>", line 1, in <module> 12# frutas.remove("melão") 13# ~~~~~~~~~~~~~^^^^^^^^^ 14# KeyError: 'melão'
discard()Remove o item se existir e o ignora se ele não existir:
1frutas = {"maçã", "banana", "laranja"} 2 3frutas.discard("uva") # não gera erro 4frutas.discard("banana") 5 6print(frutas) 7 8# Saída possível: 9# {'maçã', 'laranja'}
pop()Remove um item aleatório e o retorna.
1frutas = {"maçã", "banana", "laranja"} 2removida = frutas.pop() 3 4print(removida) 5print(frutas) 6 7# Saída possível: 8# banana 9# {'maçã', 'laranja'}
Como conjuntos não têm ordem, não há como saber qual item será removido. Mas caso não haja elementos no conjunto, um erro é gerado:
1frutas = {} 2frutas.pop() 3 4# Saída: 5# Traceback (most recent call last): 6# File "<stdin>", line 1, in <module> 7# frutas.pop() 8# ~~~~~~~~~~^^ 9# TypeError: pop expected at least 1 argument, got 0
clear()Remove todos os itens, mas a variável continua existindo.
1frutas = {"maçã", "banana", "laranja"} 2 3frutas.clear() 4print(frutas) 5 6# Saída: 7# set() # ou seja, o conjunto está vazio
delApaga a variável e seus elementos, removendo o conjunto por inteiro da memória. Após usar o del, frutas deixa de existir completamente:
1frutas = {"maçã", "banana"} 2del frutas 3 4print(frutas) 5 6# Saída: 7# Traceback (most recent call last): 8# File "<stdin>", line 1, in <module> 9# print(frutas) 10# ^^^^^^ 11# NameError: name 'frutas' is not defined
len()Retorna a quantidade de itens do conjunto.
1frutas = {"maçã", "banana", "laranja"} 2print(len(frutas)) 3 4# Saída: 5# 3
copy()Cria uma cópia de um conjunto. Modificações no conjunto copiado não afetam o conjunto original.
1original = {1, 2, 3} 2 3copia = original.copy() 4print(copia) 5 6# Saída possível: 7# {1, 2, 3}
O frozenset é a versão imutável de um conjunto. Ele funciona quase igual ao set, mas com uma diferença essencial: depois de criado, você não pode mais mudá-lo.
Isso significa que você não pode adicionar, remover ou alterar valores dentro dele. É como se fosse um conjunto "congelado", como seu nome diz.
Mesmo sendo imutável, ele mantém todas as características de um conjunto comum:
Observe:
1frutas = frozenset({"maçã", "banana", "laranja"}) 2 3print(frutas) 4print(type(frutas)) 5print(len(frutas)) 6 7# Saída possível: 8# frozenset({'banana', 'laranja', 'maçã'}) 9# <class 'frozenset'> 10# 3
Como o frozenset não muda, ele se torna útil em situações onde você precisa garantir que aquele conjunto não será modificado ao longo do programa.
Atenção: Sempre que você fizer uma operação entre um
frozensete outro conjunto, o resultado será um novofrozenset, preservando a característica da imutabilidade e protegendo os seus elementos.
frozenset vs. Conjuntos set vs. Tuplas vs. ListasAntes de avançar, vale recapitular as diferenças entre tuplas e listas, e resumir como os dois tipos de conjuntos diferem delas:
| Característica | Listas | Tuplas | Conjuntos (set) | Conjuntos (frozenset) |
|---|---|---|---|---|
| Mutabilidade | Mutáveis. | Imutáveis. | Mutáveis. | Imutáveis. |
| Ordem | Mantêm a ordem dos itens. | Mantêm a ordem dos itens. | Não têm ordem fixa. | Não têm ordem fixa. |
| Valores duplicados | Permitidos. | Permitidos. | Não permitidos. | Não permitidos. |
| Sintaxe de criação | Colchetes [] ou função list(). | Parênteses () ou função tuple(). | Chaves {} ou função set(). | Criado apenas comfrozenset(). |
| Acesso por índice | Sim (lista[0]). | Sim (tupla[0]). | Não possuem índices. | Não possuem índices. |
Na próxima lição, vamos aprender a comparar conjuntos usando operações da matemática, como união e interseção. Elas são ferramentas essenciais para analisar coleções de dados.